我有一个简单的RecyclerView,它看起来像一个列表,我为每个视图设置了一个不同的ID,并通过单击第一个视图来添加视图,并在单击它们时删除视图(期望第一个视图)。无法正常工作的是,当我删除一个视图然后添加另一个视图时,新视图的ID破坏了顺序。

适配器

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

   private List<String> items = new ArrayList<>();

    public void addItem(String name) {
        items.add(name);
        notifyItemInserted(items.size() - 1);
    }

    public void removeItem(int position) {
        items.remove(position);
        notifyItemRemoved(position);
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.add_event_item, parent, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
    }

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

    static int i;

    class ViewHolder extends RecyclerView.ViewHolder{

        public TextView eventName;
        public RelativeLayout theLayout;


        public ViewHolder(View itemView) {
            super(itemView);
            eventName = (TextView)itemView.findViewById(R.id.eventName);
            theLayout = (RelativeLayout)itemView.findViewById(R.id.backgroundevent);

            theLayout.setId(++i);
            eventName.setText(String.format("", i));

            theLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (v.getId() == 1){
                    addItem("");
                }else {
                    removeItem(getAdapterPosition());
                }
            }
        });
        }
    }
}


实现:

    final AddEventsAdapter AddContainer = new AddEventsAdapter();
    AddEventsRecycler.setLayoutManager(new LinearLayoutManager(this));
    AddEventsRecycler.setAdapter(AddContainer);
    AddEventsRecycler.setItemViewCacheSize(666);

    AddContainer.addItem("");


每行的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="@drawable/event_clicked_ripple"
    android:clickable="true"
    android:id="@+id/backgroundevent"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp">

    <TextView
        android:clickable="false"
        android:id="@+id/eventName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="something"
        android:layout_centerVertical="true"
        android:layout_toLeftOf="@+id/eventImage"
        android:layout_toStartOf="@+id/eventImage"
        android:layout_marginRight="10dp"/>

    <ImageButton
        android:clickable="false"
        android:id="@+id/eventImage"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:background="@drawable/oval_shape"/>

</RelativeLayout>


我的问题是,如果我添加5个视图,请删除第二个视图,然后添加另一个视图,它将再次添加第二个视图或第6个视图。
因此,我认为这里的问题是如何在删除视图后不回收视图?

最佳答案

RecyclerViews背后的想法是,您在onCreateViewHolder()中提供的视图持有者可以重复用于同一viewType的视图。这种行为使RecyclerViews变得高效-膨胀视图的成本很高,而运行findViewById的成本也很高。

您没有覆盖getItemViewType,因此您的RecyclerView仅具有一种视图类型-即,当您滚动浏览多个视图并删除/添加视图时,您的ViewHolders可以自由地在彼此之间进行回收。

那么代码中发生了什么?删除第二个视图时,其ViewHolder将被回收,并发送回回收器视图池。当您添加视图编号6时,回收者视图使用编号2中的回收视图支架。因此,永远不会调用onCreateViewHolder(因为有一个额外的视图要回收!)。但是,将调用onBindViewHolder。因此,添加一种方法来更新ViewHolder显示的数据:

 public void setData(final int position) {
    eventName.setText(String.format("", position));
    theLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (position == 1){
                addItem("");
            }else {
                removeItem(position);
            }
        }
}


并在onBindViewHolder中调用此方法:

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
     holder.setData(position);
}

10-06 09:01
查看更多