对列表适配器的notifyDataSetChanges,仅修改视图的一部分

时间:2015-06-05 11:15:15

标签: android listview baseadapter

这是一个非常奇怪的问题,我理解这里是否会是downvotes

所以我有一个具有这种视图的自定义适配器(使用ViewHolder模式):

    private class ViewHolder {
        ImageView chatImage;
        TextView chatName;
        TextView lastMessage;
        TextView lastMessageTime;
        TextView unreadMessagesCount;
        //ViewStub avatarsViewStub;
    }

    private ViewHolder createViewHolder (View view) {
        ViewHolder holder = new ViewHolder();
        holder.chatImage = (ImageView) view.findViewById(R.id.chat_image);
        holder.chatName = (TextView) view.findViewById(R.id.chat_participant_name);
        holder.lastMessage = (TextView) view.findViewById(R.id.last_message);
        holder.lastMessageTime = (TextView) view.findViewById(R.id.last_message_time);
        holder.unreadMessagesCount = (TextView) view.findViewById(R.id.unread_messages_count);
        return holder;
    }

TextView unreadMessagesCount假设显示未读消息的数量,并且每当有新消息发布时都应该更新。但是你可以看到有很多Views,我的目标是:只更新unreadMessagesCount,而不是在调用getView 时调用整个adapter.notifyDataSetChanges(),我想要知道是否可能

编辑:我已将我当前的解决方案作为答案之一发布,但我们仍在寻找更好的方法

1 个答案:

答案 0 :(得分:0)

您只能更新ListView的列表项中的所需视图。通过使用以下方法,您可以在给定位置查看listitem。

public View getViewByPosition(int position) {
    final int firstListItemPosition = filesListview.getFirstVisiblePosition();
    final int lastListItemPosition = firstListItemPosition + filesListview.getChildCount() - 1;
    if (position < firstListItemPosition || position > lastListItemPosition) {
        // return filesListview.getAdapter().getView(position, filesListview.getChildAt(position), filesListview);
        return null;
    } else {
        final int childIndex = position - firstListItemPosition;
        return filesListview.getChildAt(childIndex);
    }
}

在特定位置获取视图后,您可以使用ViewHolder获取getTag()并更新数据。

View listItem = getViewByPosition(position);
if(listItem!=null){
    ViewHolder holder = (ViewHolder)view.getTag();
   //Update the data
}