Android 之BaseRecyclerAdapter简单封装之路

导读:本篇文章讲解 Android 之BaseRecyclerAdapter简单封装之路,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1。使用Recyclerview代替Listview做列表数据,已经是主流了,虽然Recyclerview提供了很强大的功能,但我就得小小遗憾的是居然没有点击事件,每次都需要人为的定义接口来实现点击事件,所以讲到这里,既然封装,那就从最简单的点击事件开始吧。。。

//RecyclerView的item点击事件
public interface RvListener {
    void onItemClick(int id, int position);
}

2。发现,我们每使用一个adapter的时候,就需要一个对应ViewHolder操作。。。
这一步巧妙的把RvListener放进来了

public abstract class RvHolder<T> extends RecyclerView.ViewHolder {
    protected RvListener mListener;

    public RvHolder(View itemView, int type, RvListener listener) {
        super(itemView);
        this.mListener = listener;
        //这一步巧妙的把RvListener放进来了,这一步巧妙的把RvListener放进来了,这一步巧妙的把RvListener放进来了
        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mListener.onItemClick(v.getId(), getAdapterPosition());
            }
        });
    }

    public abstract void bindHolder(T t, int position);

}

3,最后就是adapter的定义

public abstract class RvAdapter<T>  extends  RecyclerView.Adapter<RvHolder>{

    protected List<T> list;
    protected Context mContext;
    protected RvListener listener;
    protected LayoutInflater mInflater;

    public RvAdapter(Context context, List<T> list, RvListener listener) {
        mContext = context;
        mInflater = LayoutInflater.from(context);
        this.list = list;
        this.listener = listener;
    }

    @Override
    public RvHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(getLayoutId(viewType), parent, false);
        return getHolder(view, viewType);
    }

    protected abstract int getLayoutId(int viewType);

    @Override
    public void onBindViewHolder(RvHolder holder, int position) {
        holder.bindHolder(list.get(position), position);
    }

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

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


    /**
     *      刷新数据
     * @param data
     */
    public   void updata(List<T> data){
        this.list=data;
        notifyDataSetChanged();
    }

    /**
     * 刷新数据
     */
    public  void udaptanotify(){
        list.clear();
        notifyDataSetChanged();
    }

    protected abstract RvHolder getHolder(View view, int viewType);
}

使用:定义一个RvDemoAdapter extends RvAdapter

public class RvDemoAdapter extends RvAdapter<UserInfo> {


    public RvDemoAdapter(Context context, List<UserInfo> list, RvListener listener) {
        super(context, list, listener);
    }


    @Override
    protected int getLayoutId(int viewType) {
        return viewType == 0 ? R.layout.item_title : R.layout.item_content;
    }

    @Override
    public int getItemViewType(int position) {
        return list.get(position).isTitle() ? 0 : 1;
    }

    @Override
    protected RvHolder getHolder(View view, int viewType) {
        return new RvDemoHolder(view, viewType, listener);
    }

    class RvDemoHolder extends RvHolder<UserInfo> {

        TextView title;
        TextView content;


        public RvDemoHolder(View itemView, int type, RvListener listener) {
            super(itemView, type, listener);
            switch (type) {
                case 0:
                    title = (TextView) itemView.findViewById(R.id.title);
                    break;

                case 1:
                    content = (TextView) itemView.findViewById(R.id.content);
                    break;
            }
        }


        @Override
        public void bindHolder(UserInfo userInfo, int position) {
            int itemViewType = RvDemoAdapter.this.getItemViewType(position);
            switch (itemViewType) {

                case 0:

                    title.setText(userInfo.getName());
                    break;

                case 1:

                    content.setText(userInfo.getName());

                    break;
            }
        }
    }
}

两个item布局文件:
item_title.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:id="@+id/ll_title"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">

    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:gravity="center"
        android:text="...."/>
</LinearLayout>

item_content.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:gravity="center"
              android:id="@+id/ll_content"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">



    <ImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@mipmap/ic_launcher"/>

    <TextView
        android:id="@+id/content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="....."/>

</LinearLayout>

Maintivity

public class MainActivity extends AppCompatActivity {
    private RecyclerView mRecyclerView;
    private List<UserInfo> datas=new ArrayList<>();
    private RvDemoAdapter mRvDemoAdapter;
    private GridLayoutManager mManager;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();
    }

    private void initView() {
        mRecyclerView = (RecyclerView) findViewById(R.id.RecyclerView);
        initData();
    }

    private void initData() {

        for (int i = 0; i <10 ; i++) {
            UserInfo info=new UserInfo();
            info.setName("title"+i);
            info.setTitle(true);
            datas.add(info);
            for (int j = 0; j <6 ; j++) {
                UserInfo infos=new UserInfo();
                infos.setName("第"+i+"item"+j);
                datas.add(infos);
            }

        }

        initAdapter();
     }

    private void initAdapter() {
        mManager=new GridLayoutManager(this,3);

        mManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                return datas.get(position).isTitle()? 3 :1;
            }
        });
        mRvDemoAdapter=new RvDemoAdapter(this, datas, new RvListener() {
            @Override
            public void onItemClick(int id, int position) {
                switch (id){
                    case R.id.ll_title:

                        Toast.makeText(MainActivity.this, datas.get(position).getName(), Toast.LENGTH_SHORT).show();

                        break;

                    case R.id.ll_content:
                        Toast.makeText(MainActivity.this, datas.get(position).getName(), Toast.LENGTH_SHORT).show();
                        break;

                }
            }
        });

        mRecyclerView.setLayoutManager(mManager);
        mRecyclerView.setAdapter(mRvDemoAdapter);


    }


}

一个实体类

public class UserInfo {
    private String name;
    private String content;
    private boolean isTitle;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public boolean isTitle() {
        return isTitle;
    }

    public void setTitle(boolean title) {
        isTitle = title;
    }
}

效果图:

这里写图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/12853.html

(0)
小半的头像小半

相关推荐

半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!