【问题标题】:RecyclerView clear list and add new item show old item tooRecyclerView 清除列表并添加新项目也显示旧项目
【发布时间】:2016-07-31 09:50:38
【问题描述】:

这是我的适配器

 public class MessageAdapter1 extends RecyclerView.Adapter<MessageAdapter1.ViewHolder> {

private List<MessageList> mMessages;
private int[] mUsernameColors;
private Context context;

public MessageAdapter1(Context context, List<MessageList> messages) {  
mMessages = messages;
this.context = context;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
int layout = -1;

int type = -1;
if(mMessages.get(viewType).getDir().equals("left"))         type = 1;
else if(mMessages.get(viewType).getDir().equals("right"))   type = 0;
else if(mMessages.get(viewType).getDir().equals("typing"))  type = 2;


switch (type) {
case MessageList.TYPE_MESSAGE_RIGHT:
    layout = R.layout.right_message;
    break;
case MessageList.TYPE_MESSAGE_LEFT:
    layout = R.layout.left_message;
    break;
case MessageList.TYPE_ACTION:
    layout = R.layout.message_left;
    break;
}

View v = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);

return new ViewHolder(v);
}

@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
MessageList message = mMessages.get(position);


viewHolder.setGroupMessage(message);
 }

@Override
public int getItemCount() {
return mMessages.size();
}



 @Override
 public int getItemViewType(int position) {

 return position;
 }




public class ViewHolder extends RecyclerView.ViewHolder {

private LinearLayout groupMessage;

public ViewHolder(View itemView) {
    super(itemView);

    groupMessage = (LinearLayout)itemView.findViewById(R.id.messages);

}

public void setGroupMessage(MessageList m) {


    if (null == groupMessage) return;

    int i = 0;

    if(m.getMessageStatus() == false){
      m.setMessageStatus(true);
        for (String message : m.getMessageList()) {

            //TextView text = new TextView(activity);
            TextView text = new MyTextView(context);
            LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            p.setMargins(0, 0, 0, 2);

            if (m.getDir().equals("left")) {

                text.setTextColor(Color.BLACK);
                p.gravity = Gravity.LEFT;
                if(m.getMessageList().size() == 1){
                    text.setBackgroundResource(R.drawable.message_left_default);
                }
                else if (i == 0) {
                    text.setBackgroundResource(R.drawable.message_left_first);
                } else if (i + 1 == m.getMessageList().size()) {
                    text.setBackgroundResource(R.drawable.message_left_last);
                } else {
                    text.setBackgroundResource(R.drawable.message_left);
                }


            } else{

                p.gravity = Gravity.RIGHT;
                text.setTextColor(Color.WHITE);

                if(m.getMessageList().size() == 1){
                    text.setBackgroundResource(R.drawable.message_right_default);
                }
                else if (i == 0) {
                    text.setBackgroundResource(R.drawable.message_right_first);
                } else if (i + 1 == m.getMessageList().size()) {
                    text.setBackgroundResource(R.drawable.message_right_last);
                } else {
                    text.setBackgroundResource(R.drawable.message_right);
                }

            }


            text.setLayoutParams(p);
            text.setText(message);
            text.setPadding(8, 8, 8, 8);

            text.setTextSize(18f);



            //text.setTextAppearance(context, android.R.style.TextAppearance_Large);
            groupMessage.addView(text);
            i++;
        }

 }
 }
 }
 }

现在在我的活动中初始化适配器

public  RecyclerView.Adapter mAdapter;
public  RecyclerView mMessagesView;
public  List<MessageList> Message_List = new ArrayList<MessageList>();

onCreate 活动

    mAdapter = new MessageAdapter1(getApplicationContext(), Message_List);
    mMessagesView = (RecyclerView) findViewById(R.id.messages);
    mMessagesView.setLayoutManager(new LinearLayoutManager(this));
    mMessagesView.setAdapter(mAdapter);

在 Message_List 中添加一些数据

Message_List.add(data);
mAdapter.notifyItemInserted(Message_List.size() - 1);

结果

现在我将清除Message_List recyclerView 也必须为空

清除代码

 Message_List.clear();
 mAdapter.notifyDataSetChanged();

结果

这里是清除后向Messae_List添加新项目的问题

现在添加新数据

 Message_List.add(some data new); // message i am new data (first)
 mAdapter.notifyItemInserted(Message_List.size() - 1);

查看结果

它将我的新项目附加到旧删除的项目中,为什么旧​​项目消失了,我清除了它返回的列表

让我们尝试添加新的第二条消息

 Message_List.add(some data new); // message i am new data (second)
 mAdapter.notifyItemInserted(Message_List.size() - 1);

结果

现在添加第三个和第四个 .... 数据

结果

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    这段代码没有解决这个问题:

    list.remove(position); //remove from list
    recycler.removeViewAt(position); //remove view from recyclerview
    mAdapter.notifyItemRemoved(position); 
    

    但是,一旦您在onBindViewHolder 的开头添加以下行,就可以了:

    holder.setIsRecyclable(false);
    

    【讨论】:

      【解决方案2】:

      请看这个link。

      要从 recyclerview 中正确删除旧项目,请使用以下代码:

      list.remove(position); //remove from list
      recycler.removeViewAt(position); //remove view from recyclerview
      mAdapter.notifyItemRemoved(position); 
      

      【讨论】:

        【解决方案3】:

        所以不是清除 Message_List ,而是创建一个新的实例,然后

        NotifyDataSetChanged 那看看有没有bug....

        或者:

        mAdapter.remove(position);
        mAdapter.notifyDataSetChanged();
        

        【讨论】:

        • 我现在就试试.. 我在LOG 中看到它在Message_List 中找不到旧日期
        • Message_List = new ArrayList&lt;MessageList&gt;(); mAdapter.notifyDataSetChanged(); 项目仍在RecyclerView 中未删除!
        • 试试这个 mAdapter.remove(position);
        【解决方案4】:

        你可以这样试试吗?在适配器类中创建一个名为 refreshMessages 的方法。当你想更新消息列表时调用这个方法。

        public void refreshMessages(List<Message_List> messages) {
            this.mMessages = messages;
            notifyItemRangeChanged(0, mMessages.size());
        }
        

        清除所有数据see this

        【讨论】:

          【解决方案5】:

          致电removeAll()

          public void removeAll() {
              cardItems.clear(); //clear list
              notifyDataSetChanged();
          }
          

          removeAll() 之后需要再次初始化recyclerView。

          private void initRecycleView() {
              recyclerView.setHasFixedSize(true);
          
              // linear layout manager
              layoutManager = new LinearLayoutManager(this);
              recyclerView.setLayoutManager(layoutManagerTag);
          
          }
          

          然后用你想要的数据填充RecyclerView。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-01-26
            相关资源
            最近更新 更多