我在项目中为列表项使用不同的布局时遇到了问题。
以下是我的代码:
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;
}
}
在我开始滚动之前一切正常。有时数据推到错误布局的问题。我知道这可能是因为重复使用View列表项。 但我不明白如何强制适配器在bindView()中使用正确的视图? 可能这不是很难理解,但我不能:-( 谁能告诉我我的问题在哪里?
P.S。抱歉我的英语不完美。
答案 0 :(得分:0)
你对这种方法的看法是错误的:
@Override
public int getItemViewType(int sender_id /* it is position not sender id*/)
{
}
它没有向您发送sender_id
。相反,它会向您发送位置0,1,2,3等等。
并且您必须决定在位置0,1等时该怎么做。
一个诀窍是,您可以在构造函数中保存类级别Cursor
,然后获取该特定位置的数据并让sender_id
执行剩余步骤。