【问题标题】:Why RecyclerView is adding the last CardView deleted?为什么 RecyclerView 添加最后一个 CardView 被删除?
【发布时间】:2017-08-01 12:31:14
【问题描述】:

所以我有一个包含 CardView 的 RecyclerView,并且我的 Activity 中有一个按钮,每次单击它都会向 RecyclerView 添加一张新卡片。

在每张卡片中,我都有另一个按钮,当按下该按钮时,会删除被触摸的 CardView。

问题是我向 RecyclerView 添加了新行并删除了一些行,然后当我再次添加行时,添加的新行是我之前删除的旧行。

我该如何解决这个问题?

这是我的活动:

public class MainActivity extends AppCompatActivity {

    private ArrayList exercises;
    private Button btnNewExercise;
    private RecyclerView recyclerView;
    int i = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
    }

    private void initViews() {
        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
        recyclerView.setLayoutManager(layoutManager);
        exercises = new ArrayList<>();

        final RecyclerView.Adapter adapter = new RecyclerViewAdapter(exercises);
        recyclerView.setAdapter(adapter);

        btnNewExercise = (Button) findViewById(R.id.btnNewExercise);


        btnNewExercise.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                exercises.add("Test" +i);
                i++;

                adapter.notifyDataSetChanged();
                adapter.notifyItemInserted(exercises.size());
            }
        });


    }
}

这是我的适配器:

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

    private ArrayList<String> mDataset;


    public RecyclerViewAdapter(ArrayList myDataset) {
        mDataset = myDataset;
    }

    @Override
    public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_view_row, viewGroup, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final RecyclerViewAdapter.ViewHolder viewHolder, int i) {
        viewHolder.tv_exercise.setText(mDataset.get(i));
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder{

        private TextView tv_exercise;
        private Button btnEliminarRow;

        public ViewHolder(View view) {
            super(view);
            tv_exercise = (TextView)view.findViewById(R.id.exercise_text);
            btnEliminarRow = (Button) view.findViewById(R.id.btnEliminarRow);
            final View posas = view;


            btnEliminarRow.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    removeAt(getAdapterPosition());
                }
            });
        }

        public void removeAt(int position) {
            mDataset.remove(position);
            notifyItemRemoved(position);
            notifyItemRangeChanged(position, mDataset.size());
        }
    }
}

添加 3 个元素时的日志:

07-31 19:02:57.643 21770-21770/com.ravelinx.prueba I/System.out: Test0
07-31 19:02:58.070 21770-21770/com.ravelinx.prueba I/System.out: Test0
07-31 19:02:58.128 21770-21770/com.ravelinx.prueba I/System.out: Test1
07-31 19:02:58.505 21770-21770/com.ravelinx.prueba I/System.out: Test0
07-31 19:02:58.536 21770-21770/com.ravelinx.prueba I/System.out: Test1
07-31 19:02:58.569 21770-21770/com.ravelinx.prueba I/System.out: Test2

删除 2 个元素时没有日志

然后在再次添加 2 个元素时记录:

07-31 19:04:24.426 22679-22679/com.ravelinx.prueba I/System.out: Test0
07-31 19:04:24.467 22679-22679/com.ravelinx.prueba I/System.out: Test3
07-31 19:04:24.727 22679-22679/com.ravelinx.prueba I/System.out: Test0
07-31 19:04:24.769 22679-22679/com.ravelinx.prueba I/System.out: Test3
07-31 19:04:24.787 22679-22679/com.ravelinx.prueba I/System.out: Test4

这是一个显示问题的视频:

https://www.youtube.com/watch?v=TgFomjUJq8c

【问题讨论】:

  • 问题:你如何区分新旧的?
  • @Mani 我在每个卡片视图中都有一个 EditText,例如,我在卡片视图中写了一些内容,然后将其删除,然后我尝试添加一个新内容,然后出现带有文本的旧内容。
  • 在 onBindViewHolder() 方法中可以打印 mDataset.get(i) 的日志并在此处发布日志吗?
  • @Mani 好的,我添加了它们,但在我看来它们并没有透露任何内容。因为显示的文本来自文本视图,而不是编辑文本中显示的文本。
  • 为什么notifyItemRangeChanged() 被用于removeAt()?被移除的项目之后的项目是否被更改?

标签: java android android-cardview android-recyclerview


【解决方案1】:

更新怀疑setHasFixedSize(true) 导致现有代码库本身的整个问题删除此行应该有效。


addItem() 类似这样的内容添加到RecyclerViewAdapter.java

public void addItem(String item, int position) {
    this.mDataset.add(position, item);
    notifyItemInserted(position);
}

并替换 btnNewExercise.setOnClickListener() 的主体如下

{
   exercises.add("Test" +i);
   i++;
   adapter.addItem("test", adapter.getCount());
}

【讨论】:

  • 现在在适配器中添加项目是个好主意,但现在尝试它,cardview 没有出现,就像 recycleview 没有更新但数据集正在添加它们,因为在日志中我可以看到它的大小在增加。
  • 更新:我在 notifyItemInserted 之前添加了 notifyDataSetChanged 但问题仍然存在 我删除了一个 cardview 并在再次添加项目时再次出现。
  • 在Activity的initViews()中移除recycler.setHasFixedSize(true)
  • 好的,我删除了它,但它仍在发生
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 2013-08-20
相关资源
最近更新 更多