Android 使用动态ArrayAdapter选择多个ListView项
我正在开发一个Android聊天应用程序。在我的聊天活动中,我使用了分页的概念,这意味着将向用户显示四条消息,就像Whats应用程序一样,如果您有超过100条消息,它将显示Android 使用动态ArrayAdapter选择多个ListView项,android,android-listview,Android,Android Listview,我正在开发一个Android聊天应用程序。在我的聊天活动中,我使用了分页的概念,这意味着将向用户显示四条消息,就像Whats应用程序一样,如果您有超过100条消息,它将显示加载更多的选项。出于测试目的,我使用了四条消息的限制。这是快照 如果我单击“加载更多聊天记录”,它会显示前面的四条消息。这是另一个快照Load More Chat是为listView设置的标题视图 现在假设我从第一个屏幕截图中选择最后两个列表项,它们位于listView的第三和第四位置。像这样 现在我点击Load Mor
加载更多的选项。出于测试目的,我使用了四条消息的限制。这是快照
如果我单击“加载更多聊天记录”
,它会显示前面的四条消息。这是另一个快照Load More Chat
是为listView设置的标题视图
现在假设我从第一个屏幕截图中选择最后两个列表项,它们位于listView的第三和第四位置。像这样
现在我点击Load More Chat
选项,它会自动选择列表项,这些列表项现在放在第三和第四位置,因为ArrayAdapter已经更新。这是这张照片。这意味着它不会保留我先前选择的项目,我的应用程序中的错误也是如此
现在我很困惑该如何解决这个问题。我已经试过了,但没有成功
这是我的listview代码
listView.setMultiChoiceModeListener(this);
MultichoiceListener的重写方法如下所示
@Override
public boolean onActionItemClicked(android.view.ActionMode arg0,
MenuItem arg1) {
return false;
}
@Override
public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.chat_activity_menu, menu);
return true;
}
@Override
public void onDestroyActionMode(android.view.ActionMode arg0) {
}
@Override
public boolean onPrepareActionMode(android.view.ActionMode arg0, Menu arg1) {
return false;
}
@Override
public void onItemCheckedStateChanged(android.view.ActionMode mode,
int position, long id, boolean selected) {
final int checkedCount = listView.getCheckedItemCount();
mode.setTitle(checkedCount + " Selected");
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ListView lv = (ListView) parent;
int headerCount = lv.getHeaderViewsCount();
Log.d("d", "header count "+headerCount);
View row = convertView;
if (row == null) {
LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.activity_chat_singlemessage, parent, false);
}
containerLayout = (LinearLayout) row.findViewById(R.id.containerLayout);
messageContainer = (LinearLayout) row.findViewById(R.id.messageContainer);
ChatMessage chatMessageObj = getItem(position);
chatText = (TextView) row.findViewById(R.id.singleMessage);
timeOfChat = (TextView) row.findViewById(R.id.tvTimeOfMessage);
chatText.setText(chatMessageObj.message);
timeOfChat.setText(chatMessageObj.timeOfChat);
row.setId((int) chatMessageObj.messageID);
messageContainer.setBackgroundResource(chatMessageObj.left ? R.drawable.bubble_a : R.drawable.bubble_b);
containerLayout.setGravity(chatMessageObj.left ? Gravity.LEFT : Gravity.RIGHT);
return row;
}
ArrayAdapter中的getView方法如下所示
@Override
public boolean onActionItemClicked(android.view.ActionMode arg0,
MenuItem arg1) {
return false;
}
@Override
public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.chat_activity_menu, menu);
return true;
}
@Override
public void onDestroyActionMode(android.view.ActionMode arg0) {
}
@Override
public boolean onPrepareActionMode(android.view.ActionMode arg0, Menu arg1) {
return false;
}
@Override
public void onItemCheckedStateChanged(android.view.ActionMode mode,
int position, long id, boolean selected) {
final int checkedCount = listView.getCheckedItemCount();
mode.setTitle(checkedCount + " Selected");
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ListView lv = (ListView) parent;
int headerCount = lv.getHeaderViewsCount();
Log.d("d", "header count "+headerCount);
View row = convertView;
if (row == null) {
LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.activity_chat_singlemessage, parent, false);
}
containerLayout = (LinearLayout) row.findViewById(R.id.containerLayout);
messageContainer = (LinearLayout) row.findViewById(R.id.messageContainer);
ChatMessage chatMessageObj = getItem(position);
chatText = (TextView) row.findViewById(R.id.singleMessage);
timeOfChat = (TextView) row.findViewById(R.id.tvTimeOfMessage);
chatText.setText(chatMessageObj.message);
timeOfChat.setText(chatMessageObj.timeOfChat);
row.setId((int) chatMessageObj.messageID);
messageContainer.setBackgroundResource(chatMessageObj.left ? R.drawable.bubble_a : R.drawable.bubble_b);
containerLayout.setGravity(chatMessageObj.left ? Gravity.LEFT : Gravity.RIGHT);
return row;
}
任何帮助都将不胜感激。请帮忙。
谢谢 我理解您的问题,当您更新适配器时,所选项目不会显示(带有所选项目),因为适配器已刷新na…对吗?@gvsharma。没错。由于适配器已刷新,所选项目不会显示为选中。简单的是,对于所选消息,使用布尔值并在选中时使其为真,反之亦然。在适配器的getView()内部,根据此布尔标志更改选定消息的背景。确保您还应处理所选项目的计数。我的建议是在ChatMessage类中使用thios boolean,并为每个ChatMessage对象动态获取布尔标志。@gvsharma。谢谢你的建议,如果这能解决我的问题,我会试试的。谢谢