java - 当列表大到足以滚动时,回收器 View 适配器无法正常工作

标签 java android android-recyclerview

我有一个回收器 View 适配器,就像我提供的代码一样。使用操作栏删除功能一切正常,直到列表大到足以滚动为止。

当列表很大时,选择多个项目并点击删除并不会删除确切选定的项目。它删除了一些其他项目。但是,就像删除后一样,当列表不再需要滚动时,它会删除确切选定的项目。

那么我在这里做错了什么?

package com.itsred1.a1wallet;

import android.content.Context;
import android.graphics.Color;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.view.ActionMode;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.ArrayList;

public class RVDirLisAda extends RecyclerView.Adapter<RVDirLisAda.MyViewHolder> {
    private final Context m_con;
    private final LayoutInflater lay_inf;
    private final ArrayList<RVDat> arr_lis_his_dat;
    private ArrayList<Integer> sel_pos_lis = new ArrayList<>();
    private boolean mul_sel;

   RVDirLisAda(Context context, ArrayList<RVDat> his_dat_arr_lis) {
        m_con = context;
        lay_inf = LayoutInflater.from(context);
        this.arr_lis_his_dat = his_dat_arr_lis;
    }

    private ActionMode.Callback act_mod_cal_bac = new ActionMode.Callback() {

        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            mul_sel = true;
            menu.add("Delete");
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            for (int pos : sel_pos_lis) {
                arr_lis_his_dat.remove(pos);
            }
            mode.finish();
            return true;
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {
            mul_sel = false;
            sel_pos_lis.clear();
            notifyDataSetChanged();
        }
    };

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View vie = lay_inf.inflate(R.layout.rv_dir_lis, parent, false);
        return new MyViewHolder(vie);
    }

    @Override
    public void onBindViewHolder(@NonNull final MyViewHolder holder, int position) {
        holder.ini_row(position);
    }

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

    class MyViewHolder extends RecyclerView.ViewHolder {
        private final TextView tv_fil_nam;

        MyViewHolder(View itemView) {
            super(itemView);
            tv_fil_nam = itemView.findViewById(R.id.tv_fil_nam);
        }

        void ini_row(final int pos){
            if (sel_pos_lis.contains(pos)){
                tv_fil_nam.setBackgroundColor(Color.LTGRAY);
            } else {
                tv_fil_nam.setBackgroundColor(Color.WHITE);
            }

            final String fil_nam = arr_lis_his_dat.get(pos).get_row1_col2();
            final String tra_typ = arr_lis_his_dat.get(pos).get_tra_typ();
            final String id = arr_lis_his_dat.get(pos).get_row2_col1();
            tv_fil_nam.setText(fil_nam);
            if(tra_typ.equals("folder")) {
                tv_fil_nam.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ico_fol, 0, 0, 0);
            } else if (tra_typ.equals("file")) {
                tv_fil_nam.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ico_db,0,0,0);
            }

            tv_fil_nam.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    if(!mul_sel){
                        ((AppCompatActivity) v.getContext()).startSupportActionMode(act_mod_cal_bac);
                    }
                    sel_row(pos);
                    return true;
                }
            });

           tv_fil_nam.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(mul_sel){
                        sel_row(pos);
                    } else {
                        cal_bac(id, fil_nam, pos);
                    }
                }
            });
        }

        void sel_row(int pos) {
            if (mul_sel) {
                if (sel_pos_lis.contains(pos)) {
                    int i = sel_pos_lis.lastIndexOf(pos);
                    sel_pos_lis.remove(i);
                    tv_fil_nam.setBackgroundColor(Color.WHITE);
                } else {
                    sel_pos_lis.add(pos);
                    tv_fil_nam.setBackgroundColor(Color.LTGRAY);
                }
            }
        }

        void cal_bac(String id, String tra_typ, int pos) {
            CalBacCom cal_bac_com = null;
            if (m_con instanceof CalBacCom) {
                cal_bac_com = (CalBacCom) m_con;
            }

            if (cal_bac_com != null) {
                cal_bac_com.ini_cal_bac (id, tra_typ, pos, "row_cli");
            }
        }

    }
}

最佳答案

for (int pos : sel_pos_lis) {
    arr_lis_his_dat.remove(pos);
}

这部分代码有一个问题,当您在某个位置删除某些项目时,下一个项目的位置将发生变化,其他删除操作可能会失败并删除其他一些项目。 您应该首先删除索引较高的选项,但这与滚动和大列表无关。

关于java - 当列表大到足以滚动时,回收器 View 适配器无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57194830/

相关文章:

android - RecyclerView notifyItemInserted() 动画在位置为 0 时不显示,但在其他位置可以正常工作

android - 在Android wifi热点中获取wifi广播地址

android - 下拉android时SwipeRefreshLayout加载器不会启动

java - 由于错误,无法在 cmd 上签署 apk 文件

java - 在 Android Studio 中连接到数据库的基本 URL

android - 是否可以创建 android.os.Bundle 的 stub 以在 JVM 下进行测试?

Android SDK 库 - 它在哪里?

android - 如何从 RecyclerView 的所有项目 View 中清除 EditText 输入?

java - 如果一个单词有 5 个字母,则每行打印一个字母,如果没有,则只打印该单词?

java - 如何将 Apache Httpclient 与 Jersey 2.3 客户端一起使用