簡體   English   中英

如何從回收商視圖適配器中獲取項目

[英]How to get items from recycler view adapter

我有一個以下類(我將另一個回收器視圖適配器傳遞給構造函數):

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
        }
    }

您必須像這樣創建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{

你的代碼......

}

而且你很容易得到數據。

   public T getItem(int position) {
           return items.get(position);
         }

在 RecyclerView Adapter 中使用 RecyclerView Adapter getItem()方法獲取列表項。

發送位置並從列表中獲取項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM