2012-06-13 3 views
0

내 프로젝트의 목록 항목에 다른 레이아웃을 사용하는 데 문제가 있습니다. 내가 스크롤 시작할 때까지Android ListView : 잘못된 항목 유형을 사용하는 커서 어댑터

private class ChatAdapter extends CursorAdapter { 
    private LayoutInflater mInflater; 

    private static final int OWN_MESSAGE = 0; 
    private static final int INTERLOCUTOR_MESSAGE = 1; 

    public ChatAdapter(Context context, Cursor c) { 
     super(context, c, false); 
     mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     final TextView text = (TextView) view.findViewById(R.id.chat_message_text); 
     final String message = cursor.getString(MessagesQuery.MESSAGE_TEXT); 
     text.setText(message); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup group) { 

     View view = null; 
     final int sender_id = cursor.getInt(MessagesQuery.SENDER_ID); 
     final int messageType = getItemViewType(sender_id); 
     switch (messageType) { 
      case OWN_MESSAGE: 
       view = (View) mInflater.inflate(R.layout.list_item_message_own, null); 
       break; 
      case INTERLOCUTOR_MESSAGE: 
       view = (View) mInflater.inflate(R.layout.list_item_message_interlocutor, null); 
       break; 

     } 
     return view; 
    } 

    @Override 
    public int getItemViewType(int sender_id) { 
     return (sender_id == Prefs.getIntProperty(mContext, R.string.key_user_id)) ? OWN_MESSAGE 
       : INTERLOCUTOR_MESSAGE; 
    } 

    @Override 
    public int getViewTypeCount() { 
     return 2; 
    } 

} 

모든 것이 OK입니다 :

여기 아래에있는 내 코드입니다. 데이터가 잘못된 레이아웃으로 푸시되는 경우가 있습니다. 목록 항목을 보려면 Views를 재사용했을 가능성이 높습니다. 하지만 bindView()에서 올바른보기를 사용하도록 어댑터를 강제하는 방법을 이해하지 못합니까? 은 아마이 매우 이해하기 어려운 일이 아니다,하지만 내 문제가 어디 :-( 사람은 말해 줄 수 없다?

PS 나의 불완전한 영어에 대한 죄송합니다.

답변

0

잘못이 방법에 대한 귀하의 인식 :..

@Override 
public int getItemViewType(int sender_id /* it is position not sender id*/) 
{ 

} 

오히려 그래서 당신에게 위치를 0, 1, 2, 3을 전송하고, 당신에게 sender_id를 전송하지 않고 당신은 때 무엇을 결정해야 위치 0, 1, 및 그래서 에.

하나의 트릭은 생성자에서 클래스 수준 Cursor을 제공 한 다음 해당 특정 위치의 데이터를 가져 와서 sender_id 나머지 단계를 수행 할 수 있다는 것입니다.

+0

완전히 수정했습니다. 정확하게 getItemViewType() 메소드를 이해하지 못했습니다. 도와 주셔서 감사합니다! 이제 모든 것이 괜찮습니다. – Infernus