Android 使用动态ArrayAdapter选择多个ListView项

Android 使用动态ArrayAdapter选择多个ListView项,android,android-listview,Android,Android Listview,我正在开发一个Android聊天应用程序。在我的聊天活动中,我使用了分页的概念,这意味着将向用户显示四条消息,就像Whats应用程序一样,如果您有超过100条消息,它将显示加载更多的选项。出于测试目的,我使用了四条消息的限制。这是快照 如果我单击“加载更多聊天记录”,它会显示前面的四条消息。这是另一个快照Load More Chat是为listView设置的标题视图 现在假设我从第一个屏幕截图中选择最后两个列表项,它们位于listView的第三和第四位置。像这样 现在我点击Load Mor

我正在开发一个Android聊天应用程序。在我的聊天活动中,我使用了分页的概念,这意味着将向用户显示四条消息,就像Whats应用程序一样,如果您有超过100条消息,它将显示
加载更多的选项。出于测试目的,我使用了四条消息的限制。这是快照

如果我单击“加载更多聊天记录”
,它会显示前面的四条消息。这是另一个快照
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。谢谢你的建议,如果这能解决我的问题,我会试试的。谢谢