【问题标题】:Using Switch in RecyclerView srcoll在 RecyclerView 滚动中使用 Switch
【发布时间】:2016-08-16 20:44:16
【问题描述】:

我在RecyclerView 中使用了Switch。它面临着回收行为的问题。当我打开第一个位置时,它会自动打开第 10 个位置的开关......我认为这是由于视图的重用。如何修复它。找到截图: https://www.dropbox.com/s/4ms2jf9e28fyc7u/error.png?dl=0

    private void setAdapter(ArrayList data) {

            ManageCategoryAdapter adapter = new ManageCategoryAdapter(data);
            adapter.SetOnItemClickListener(listClick);
            mRecyclerView.setAdapter(adapter);
        }
     public class ManageCategoryAdapter extends RecyclerView.Adapter<ManageCategoryAdapter.ViewHolder> {


    private ArrayList<String> catData=new ArrayList<>();
    private OnItemClickListener mItemClickListener;


    public ManageCategoryAdapter(ArrayList<String> listadap) {
        catData=listadap;
        System.out.println("$$$$$$$$$"+"adapterclass");

    }


    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_manage_list, parent, false);
        return new ViewHolder(v);
    }


    public void onBindViewHolder(ViewHolder holder, int position) {

        holder.category.setText(catData.get(position));


    }


    public int getItemCount() {

        return catData.size();
    }


    public void onClick(View view) {

    }

    public  class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        public TextView category;
        public Switch switchClick;

        public ViewHolder(View itemView) {
            super(itemView);
            category=(TextView)itemView.findViewById(R.id.cat_text);
            switchClick=(Switch)itemView.findViewById(R.id.switch_btn);
            switchClick.setOnClickListener(this);

        }

        @Override
        public void onClick(View v) {
            if (mItemClickListener != null) {
                mItemClickListener.onItemClick(v, getPosition());
            }

        }
    }
    public void myNotifyDataSetChanged(ArrayList list)
    {
        System.out.println("$$$notify");
        catData.addAll(list);
        this.notifyDataSetChanged();
    }

    public interface OnItemClickListener {
        public void onItemClick(View view, int position);
    }

    public void SetOnItemClickListener(final OnItemClickListener mItemClickListener) {
        this.mItemClickListener = mItemClickListener;
    }
}

这就是我设置适配器类的方式

【问题讨论】:

  • 请发布您的ManageCategoryAdapter
  • 找到适配器类
  • 也把代码贴在onItemClick回调函数中
  • 你必须维护每个开关按钮的状态
  • 如何管理那个

标签: java android android-recyclerview


【解决方案1】:

你需要在适配器中使用这个:

@Override
    public int getItemViewType(int position) {
        return position;
    }

【讨论】:

  • 它有效,但有一个问题。我认为这根本不够,最好的选择是什么?例如,我有 100 件物品,使用这种方法,我实际上是装箱 100 件物品
  • @YasinHajilou 现在我可以推荐开始使用 ListAdapter。除了 RecyclerView 之外,这是一个非常好的更新和选项。您可以查看这篇文章以获取更多信息:medium.com/androiddevelopers/…
【解决方案2】:

这是RecyclerView 的一个非常常见的问题,Stackoverflow 中有很多答案。

您已经理解了您的问题,即重用视图。因此,您可以查看这些答案,以更好地了解如何克服它。

我希望这些对你有用。

【讨论】:

    猜你喜欢
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    相关资源
    最近更新 更多