【问题标题】:How to get items from recycler view adapter如何从回收站视图适配器中获取项目
【发布时间】:2020-01-21 21:58:25
【问题描述】:

我有以下类(我将另一个回收器视图适配器传递给构造函数):

class BaseAdapter<T>(private var items: ArrayList<T?>, private val adapter: RecyclerView.Adapter<RecyclerView.ViewHolder>): RecyclerView.Adapter<RecyclerView.ViewHolder>()

是否可以不直接传递项目并从适配器获取它们?

我不想再次传递项目并想从适配器获取它们。

private var adapter: RecyclerViewAdapter? = null
adapter = RecyclerViewAdapter(items!!, applicationContext) // another adapter, can be any


recyclerView.layoutManager = layoutManager
recyclerView.adapter = BaseAdapter(items, adapter!!)

如你所见,我传递了两次项目,因为我需要在新的适配器中使用它们,比如

 override fun showAd(firstVisibleItemPosition: Int) {
        if(isInsertionNeeded){
            items.add(firstVisibleItemPosition + 1, null)

            setVisibleItemPos(firstVisibleItemPosition + 1)

            notifyItemInserted(firstVisibleItemPosition+1)

            isInsertionNeeded = false
        }
    }

【问题讨论】:

  • 你的问题不清楚,请问清楚
  • 在 Adapter 类中添加 items 变量,重写 set 方法以使用新数组重新加载适配器,您可以查看 DiffUtils

标签: java android kotlin android-recyclerview


【解决方案1】:

您必须像这样创建 BaseRecyclerViewAdapter:-

public abstract class BaseRecyclerViewAdapter<T> extends RecyclerView.Adapter implements AppConstants {

    public SmartArrayList<T> mArrayList;
    public Context mContext;
    private int margin;

    public BaseRecyclerViewAdapter(Context mContext) {
        this.mArrayList = new SmartArrayList<>();
        this.mContext = mContext;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(getView(), parent, false);
        return getViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position) {
        if (mArrayList != null && mArrayList.size() > 0) {
            final T obj = mArrayList.get(holder.getAdapterPosition());
            setData(holder, obj, position);
        }
    }


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

    public abstract RecyclerView.ViewHolder getViewHolder(View view);

    public abstract int getView();

    public abstract void setData(RecyclerView.ViewHolder holder, T data, int position);

    public void addAll(ArrayList<T> mArrayList) {
        if (null != mArrayList) {
            this.mArrayList.addAll(mArrayList);
            notifyItemRangeInserted(getItemCount(), mArrayList.size());
        }
    }

    public void updateAll(ArrayList<T> mArrayList) {
        this.mArrayList = new SmartArrayList<>();
        this.mArrayList.addAll(mArrayList);
        notifyDataSetChanged();
//        notifyItemRangeInserted(getItemCount(), mArrayList.size());
    }

    public void clear() {
        this.mArrayList.clear();
        notifyDataSetChanged();
    }

    public void update(int position, T obj) {
        this.mArrayList.set(position, obj);
        notifyItemChanged(position);
    }

    public void remove(int position) {
        this.mArrayList.remove(position);
        notifyItemRemoved(position);
        notifyItemRangeChanged(position,mArrayList.size());
    }

    public void add(T obj) {
        int position = mArrayList.size();
        this.mArrayList.add(obj);
        notifyItemInserted(position);
    }

    public void add(int position, T obj) {
        this.mArrayList.add(obj);
        notifyItemInserted(position);
    }

    public SmartArrayList<T> getData() {
        return mArrayList;
    }
}

使用......

公共类 YourAdapterName 扩展 BaseRecyclerViewAdapter{

你的代码......

}

而且你很容易得到数据。

【讨论】:

    【解决方案2】:
       public T getItem(int position) {
               return items.get(position);
             }
    

    在 RecyclerView Adapter 中使用 RecyclerView Adapter getItem() 方法获取列表项。

    发送位置并从列表中获取项目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多