RecyclerView 使用 可动态添加删除编辑

一、创建通用 RecyclerView.Adapter
public class CommonAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private static final String TAG = AppConstants.APP_TAG + " CommonAdapter ";

    private List<BaseBean> mDatas;
    private Context mContext;
    private LayoutInflater mLayoutInfater;
    private BaseHolder.OnRecyclerViewItemClickListener mOnItemClickListener;

    /**
     * Construct function.
     */
    public CommonAdapter(Context context, List<BaseBean> baseBeans) {
        LogUtil.d(TAG + "CommonAdapter ");
        this.mContext = context;
        mLayoutInfater = LayoutInflater.from(mContext);
        this.mDatas = baseBeans;
    }

    public void setDatas(List<BaseBean> baseBeans) {
        this.mDatas = baseBeans;
    }

    /**
     * Add item data.
     *
     * @param baseBean BaseBean
     */
    public void addItem(int position, BaseBean baseBean) {
        if (mDatas == null) {
            mDatas = new ArrayList<>();
        }
        int count = mDatas.size();
        mDatas.add(position, baseBean);
        notifyItemInserted(position);
        notifyItemRangeChanged(position, count - position);
    }

    public void removeItem(int position) {
        if (mDatas == null) {
            mDatas = new ArrayList<>();
        }
        int count = mDatas.size();
        mDatas.remove(position);
        notifyItemRemoved(position);
        notifyItemRangeChanged(0, count - position);
    }

    public void editItem(int position, BaseBean baseBean) {
        mDatas.set(position, baseBean);
        notifyItemChanged(position, SendReviewHolder.NOTIFY_ALL); //整个item局部刷新
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view;
        LogUtil.d(TAG + "onCreateViewHolder viewType:" + viewType);
        switch (viewType) {
            case BaseBean.SEND_REVIEW:
                view = mLayoutInfater.inflate(R.layout.layout_send_review_item, parent, false);
                return new SendReviewHolder(view, mOnItemClickListener);
            case BaseBean.TO_SEND:
                view = mLayoutInfater.inflate(R.layout.layout_to_send_item, parent, false);
                return new ToSendHolder(view, mOnItemClickListener);
            default:
                LogUtil.d(TAG + "onCreateViewHolder error can not find viewType:" + viewType);
                break;
        }

        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        LogUtil.d(TAG + "onBindViewHolder(..) position:" + position);
        int viewType = getItemViewType(position);
        ((BaseHolder) holder).bindHolder(mDatas.get(position), position);
    }

//    @Override
//    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position, @NonNull List<Object> payloads) {
//        LogUtil.d(TAG + "onBindViewHolder(...) position:" + position);
//        ((BaseHolder) holder).bindHolder(mDatas.get(position), position, payloads);
//    }

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

    @Override
    public int getItemViewType(int position) {
        return mDatas.get(position).getType();
    }

    public void setOnItemClickListener(
        BaseHolder.OnRecyclerViewItemClickListener listener) {
        this.mOnItemClickListener = listener;
    }
}
二、创建 BaseHolder 及其 子类 ToSendHolder和条目布局
ToSendHolder 用来刷新一个条目界面
public abstract class BaseHolder extends RecyclerView.ViewHolder
    implements View.OnClickListener {
    private static final String TAG = AppConstants.APP_TAG + "BaseHolder ";
    protected OnRecyclerViewItemClickListener mItemClickListener = null;

    public BaseHolder(View itemView,
                      OnRecyclerViewItemClickListener recyclerViewItemClickListener) {
        super(itemView);
        mItemClickListener = recyclerViewItemClickListener;
    }

    public abstract void bindHolder(BaseBean model, int position);
  public <T extends View> T getView(int viewId) { //将view存储到数组中,每次从数组中读取view
      View view = sparseArray.get(viewId);
      if (view == null) {
          view = itemView.findViewById(viewId);
          sparseArray.put(viewId, view);
      }
      LogUtil.d(TAG + " getView() viewId:" + viewId + " view:" + view);
      return (T) view;
  }
    public abstract void bindHolder(BaseBean model, int position, @NonNull List<Object> payloads);

    public interface OnRecyclerViewItemClickListener {
        void onItemClick(View view, SurpriseBean surpriseBean);
    }

    public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
        mItemClickListener = listener;
    }

    @Override
    public void onClick(View v) {
        mItemClickListener.onItemClick(v, (SurpriseBean) v.getTag());
    }

}
public class ToSendHolder extends BaseHolder {

    private static final String TAG = AppConstants.APP_TAG + "ToSendHolder ";
    private TextView mTextMsgContent;

    /**
     * Construct function.
     *
     * @param itemView                      item view.
     * @param recyclerViewItemClickListener recyclerViewItemClickListener.
     */
    public ToSendHolder(View itemView,
                        OnRecyclerViewItemClickListener
                            recyclerViewItemClickListener) {
        super(itemView, recyclerViewItemClickListener);

        this.mItemClickListener = recyclerViewItemClickListener;
        mTextMsgContent = getView(R.id.txt_msg_content); //通过父类中 getView 方法获取view,不用每次从父布局中遍历
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mItemClickListener.onItemClick(itemView, (SurpriseBean) itemView.getTag());
                //itemView.setBackgroundColor(ResourcesUtil.getColor(
                // MyApplication.getAppContext(), R.color.colorPrimary));
            }
        });
    }

    @Override
    public void bindHolder(BaseBean model, int position) {

        LogUtil.d(TAG + " bindHolder() 111 position:" + position
            + " model:" + model + " mTextMsgContent:" + mTextMsgContent);

        doBindHolder(model, position, 0);
    }

    @Override
    public void bindHolder(BaseBean model, int position, @NonNull List<Object> payloads) {
        doBindHolder(model, position, 0);
    }

    private void doBindHolder(BaseBean model, int position, int nofifyType) {
        if (!(model instanceof ToSendBean)) {
            LogUtil.d(TAG + " bindHolder() 222 not ToSendBean return");
            return;
        }
        ToSendBean toSendBean = (ToSendBean) model;
        if (null == toSendBean) {
            return;
        }
        SurpriseBean surpriseBean = toSendBean.getSurpriseBean();
        if (null == surpriseBean || null == mTextMsgContent) {
            LogUtil.d(TAG + " bindHolder() 333 return!");
            return;
        }
        String content = surpriseBean.getMContent();
        long id = surpriseBean.getMId();
        LogUtil.d(TAG + " bindHolder() 444 content:" + content + " id:" + id);
        itemView.setTag(surpriseBean);
        mTextMsgContent.setText(content);

    }
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="wrap_content"
    android:layout_height="@dimen/to_send_sub_item_height"
    android:clickable="true"
    android:background="@color/listItemColor"
    android:foreground="?android:attr/selectableItemBackground"
    android:orientation="vertical">

    <TextView
        android:id="@+id/txt_msg_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerInParent="true"
        android:gravity="center"
        android:text="@string/txt_happy_birthday"
        android:textSize="@dimen/text_size_large" />
</RelativeLayout>

相关bean自己定义
三、activity中 调用加载RecyclerView
private void initCommonAdapter() {
    LogUtil.d(TAG + "initCommonAdapter");
    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
    mRecyclerView.setLayoutManager(layoutManager);
    mRecyclerView.setItemAnimator(new DefaultItemAnimator());
    mRecyclerView.addItemDecoration(new SpacesItemDecoration(getResources()
        .getDimensionPixelSize(R.dimen.list_view_item_padding)));

    mDatas = SurpriseMessageUtil.getToSendMessageList();//此处获取自定义bean列表
    mCommonAdapter = new CommonAdapter(this, mDatas);

    setAdapterListener();
    mRecyclerView.setAdapter(mCommonAdapter);
}
调用addItem方法可以动态添加列表条目
调用removeItem方法可以动态删除列表条目
调用editItem方法可以动态编辑列表条目
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值