recycleview的基础Adapter

.封装了一个基础的adapter.,用于recycleview的快捷使用
有BaseAdapter,BaseViewHolder,PAdapter,MainActivity

public abstract class BaseAdapter<T> extends RecyclerView.Adapter<BaseViewHolder> {

    public List<T> mDatas;

    public LayoutInflater mLayoutInflater;
    public Context mContext;
    public int mLayout;

    public BaseAdapter(Context context,List<T> datas,int layout){
        this.mDatas=datas;
        this.mContext=context;
        this.mLayout=layout;
        mLayoutInflater =LayoutInflater.from(context);
    }

    @Override
    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view=  mLayoutInflater.inflate(mLayout,null,false);
        return new BaseViewHolder(view);
    }

    @Override
    public void onBindViewHolder(BaseViewHolder holder, int position) {
        T t =getItem(position);

        bindData(holder,t);
    }

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

    @Override
    public int getItemCount() {
        if(mDatas!=null && mDatas.size()>0){
            return mDatas.size();
        }
        return 0;
    }

    public List<T> getmData() {
        return mDatas;
    }
    public void clearData(){
        if(mDatas.size()>0 && mDatas!=null){
            int presize= mDatas.size();
            mDatas.clear();
            notifyItemRangeRemoved(0,presize);
        }
    }

    public void addData(int position,List<T> datas){
        if (datas!=null && datas.size()>0){
            mDatas.addAll(datas);
            notifyItemRangeInserted(position,mDatas.size());
        }
    }

    public abstract void bindData(BaseViewHolder viewHolder,T t);
}
public class BaseViewHolder extends RecyclerView.ViewHolder {
    public SparseArray<View> views;

    public BaseViewHolder(View itemView) {
        super(itemView);
        views = new SparseArray<>();

    }

    public TextView  getTextView(int id){
        return findView(id);
    }

    public ImageView getImageView(int id){
        return findView(id);
    }

    public Button getButton(int id){
        return findView(id);
    }

    private <T extends View> T findView(int id){
        View view =views.get(id);
        if(view==null){
             view = itemView.findViewById(id);
             views.put(id,view);
        }
        return (T) view;
    }

}
public class PAdapter extends BaseAdapter<PayBean.Data> {

    public PAdapter(Context context, List<PayBean.Data> datas) {
        super(context, datas, R.layout.view_rv_item);
    }

    @Override
    public void bindData(BaseViewHolder viewHolder, final PayBean.Data data) {
        viewHolder.getTextView(R.id.tv_id).setText(data.getId());
        viewHolder.getTextView(R.id.tv_openid).setText(data.getOpenid());

        TextView tv_id= viewHolder.getTextView(R.id.tv_id);
        TextView tv_openid= viewHolder.getTextView(R.id.tv_openid);
        tv_openid.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MyApplication.getContext(),data.getOpenid(),Toast.LENGTH_SHORT).show();
            }
        });
    }
}
public class MainActivity extends AppCompatActivity {
    private OkHttpHelper httpHelper  =OkHttpHelper.getInstance();
    private SwipeRefreshLayout swipeRefreshLayout;
    @ViewInject(R.id.tv)
    private TextView tv;

    private RecyclerView mRecyclerView;
    private ArrayList<String> mDatas=new ArrayList<>();
    private MaterialRefreshLayout materialRefreshLayout;

    private static final int STATE_NORMAL=0;
    private static final int STATE_REFRESH=1;
    private static final int STATE_MORE=2;
    private int state = STATE_NORMAL;
    private List<PayBean.Data> mData;

    private int page=1;
    private int pagesize=20;
    private int totalpages=0;
    private PAdapter payAdapter;
    private static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRecyclerView = findViewById(R.id.recycleview);
        materialRefreshLayout =findViewById(R.id.refresh);

        initRefreshLayout();
        getData();

    }

    private void initRefreshLayout(){
        materialRefreshLayout.setLoadMore(true);
        materialRefreshLayout.setMaterialRefreshListener(new MaterialRefreshListener() {
            @Override
            public void onRefresh(MaterialRefreshLayout materialRefreshLayout) {
                refreshData();
            }

            @Override
            public void onRefreshLoadMore(MaterialRefreshLayout materialRefreshLayout) {
                if(page<=totalpages){
                    loadMoreData();
                }else{
                    Toast.makeText(MyApplication.getContext(),"没有更多内容了",Toast.LENGTH_SHORT).show();
                    materialRefreshLayout.finishRefreshLoadMore();
                }
            }
        });
    }

    private void loadMoreData(){
        page=++page;

        state=STATE_MORE;
        getData();
    }

    private void refreshData(){
        page=1;
        state=STATE_REFRESH;
        getData();
    }

    private void getData(){
        String url=Api.BASE_URL+"&page="+page+"&pagesize="+pagesize;
        httpHelper.get(url, new BaseHttpCallback() {
            @Override
            public void onRequestBefore(Request request) {

            }

            @Override
            public void onSuccess(Response response, String string) {
                PayBean payBean =JSON.parseObject(string,PayBean.class);

                page= payBean.getPageindex();
                totalpages =payBean.getTotalpages();
                mData = payBean.getData();

                showData();

            }

            @Override
            public void onError(Response response, int code, Exception e) {

            }

            @Override
            public void onFailure(Exception e) {

            }
        });
    }

    private void showData(){

        switch (state){
            case STATE_NORMAL:
                payAdapter = new PAdapter(getApplicationContext(),mData);

                mRecyclerView.setAdapter(payAdapter);
                mRecyclerView.setLayoutManager(new LinearLayoutManager(MyApplication.getContext()));
                /*mRecyclerView.setAdapter(new BaseAdapter<PayBean.Data>(MyApplication.getContext(),mData,R.layout.view_rv_item) {

                    @Override
                    public void bindData(BaseViewHolder viewHolder, final PayBean.Data data) {
                        viewHolder.getTextView(R.id.tv_id).setText(data.getId());
                        viewHolder.getTextView(R.id.tv_openid).setText(data.getOpenid());

                        viewHolder.getTextView(R.id.tv_openid).setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {
                                Toast.makeText(MyApplication.getContext(),data.getOpenid(),Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                });*/
                //mRecyclerView.setLayoutManager(new LinearLayoutManager(MyApplication.getContext()));
                break;
            case STATE_REFRESH:
                payAdapter.clearData();
                payAdapter.addData(0,mData);
                mRecyclerView.scrollToPosition(0);
                materialRefreshLayout.finishRefresh();
                break;
            case STATE_MORE:
                payAdapter.addData(payAdapter.getmData().size(),mData);
                mRecyclerView.scrollToPosition(payAdapter.getmData().size());
                materialRefreshLayout.finishRefreshLoadMore();
                break;
            default:
                break;
        }

    }

}

2个布局文件

activity_main和view_rv_item

main
 <com.cjj.MaterialRefreshLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/refresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:wave_height_type="normal"
        app:isLoadMore="true"
        app:overlay="true"
        app:wave_show="true"
        >
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycleview"
            android:scrollbars="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

    </com.cjj.MaterialRefreshLayout>
    <LinearLayout
        android:id="@+id/item_layout"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/tv_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
        <TextView
            android:id="@+id/tv_openid"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

原文地址:https://www.cnblogs.com/norm/p/8280456.html

时间: 2024-12-19 13:51:58

recycleview的基础Adapter的相关文章

HeaderRecycleAdapter--通用的带头部RecycleView.Adapter

目录 概述 HeaderRecycleViewAdapter这是一个通用的RecycleView.Adapter,可以不需要继承即可简单的使用.此Adapter实现了带头部的处理显示,不需要使用头部显示时可以使用其简单版本SimpleRecycleViewAdapter. 适用范围 任何类型的数据 支持LinearLayoutManager及GridLayoutManager 支持竖直方向及横向方向 暂时不支持reverseLayout,即反方向布局 其它 对于文中提到一些不太能马上理解的点,后

IAdjustCountOption--动态设置recycleView的itemCount(不需要修改数据源)

概述RecycleViewUtil是新增的一个主要针对RecycleView的一个工具类.该工具类中提供了部分方法用来增强HeaderRecycleAdapter功能的扩展方法. 包括动态计算均分RecycleView的界面从而显示childView的功能,可随意调整itemCount的功能(不影响数据源) 概述 RecycleViewUtil是新增的一个主要针对RecycleView的一个工具类.该工具类中提供了部分RecycleView可能会使用到的方法,其中也包括了一些用来增强Header

【设计模式01】Adapter适配器模式完全解析

题 目: 适配器模式(Adapter) 名 字: km 时 间: 2015.1.29 (一)那是神马 1,官方定义 将一个类的接口转成客户端需要的另外一个接口. Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 2,我的理解 这个词最早在电工学里,有些国家用110V电压,而我们国家用220V: 你的笔记本不能任何电压都OK,所以出现了适配器,把不同的电压转换成笔记本可用的电压. 3,一些补充: 软件开发中,对系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器

IAdjustCountOption--动态设置recycleView的itemCount(不须要改动数据源)

概述 RecycleViewUtil是新增的一个主要针对RecycleView的一个工具类.该工具类中提供了部分RecycleView可能会使用到的方法,当中也包含了一些用来增强HeaderRecycleAdapter功能的扩展方法. 通过该工具类也能够非常easy在普通的adapter中实现相应的相关扩展功能. 可实现的功能有: 任意调整RecycleViewAdapter中的item数量 可依据RecycleView已确定的某一边长自己主动调整item数量以填充整个RecycleView(并

ExtraViewWrapperAdapter--添加额外头部尾部功能的装饰adapter

目录 目录 概述 关于头部和尾部 分离原始数据及装饰数据 headerView与footerView的创建与显示 使用唯一的标签 关于headerView与FooterView位置的计算 头部尾部的判断方式 与HeaderRecycleAdapter的接口相关 其它 使用方式 GitHub地址 示例图片 概述 对于ListView有自带的方法添加headerView及footerView,但是RecycleView仅仅只是维护缓存的View,本身并不处理内容显示,都交给了RecycleView.

Android 实现简易下载管理器 (暂停、断点续传、多线程下载)

什么都先别说,先看预览图! 预览图中是限制了同时最大下载数为 2 的. 其实下载管理器的实现是挺简单的,我们需要弄清楚几点就行了 1.所有任务的Bean应该存在哪里,用什么存? 2.如何判断任务是否已存在? 3.如何判断任务是新的任务或是从等待中恢复的任务? 4.应该如何把下载列表传递给Adapter? 5.如何将下载的进度传递出去? 6.如何有效率地刷新显示的列表? (ListView 或 RecycleView) 服务基础 首先我们需要明确一点,下载我们应该使用服务来进行,这样我们才能进行后

Box(视图组件)如何在多个页面不同视觉规范下的复用

本文来自 网易云社区 . 问题描述 Android App中的页面元素,都是由一个个Box(可以理解成一个个自定义View组件和Widget同级)组成,这些Box可以在不同的页面.不同的模块达到复用的效果.但是,现在遇到了一个对于开发复用棘手的问题, A页面的组件间距和B页面的组件间距可能不同. A页面的Box1与Box1间距,和Box1与Box2的间距不一样. Box和Box之间的分割线,有粗有细,有的有左边距. 等等还有许多需要动态调整的地方. 然后做这些Box组件,就是为了复用它们,但现在

RecyclerView的Item的单击事件

显示效果 RecyclerView 的每个Item的点击事件并没有像ListView一样封装在组件中,需要Item的单击事件时就需要自己去实现,在Adapter中为RecyclerView添加单击事件参考如下: RecyclerView的使用方法请参考:RecyclerView的简单使用 第一步: 在RecyclerView的Adapyer中定义单击事件的回调接口: /** * 定义RecyclerView选项单击事件的回调接口 */ public interface OnItemClickLi

java web 开发三剑客 -------电子书

Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知Internet的目的是让各个net交互.所以,Internet实质上是将世界上各个国家.各个网络运营商的多个网络相互连接构成的一个全球范围内的统一网,使各个网络之间能够相互到达.各个国家和运营商构建网络采用的底层技术和实现可能各不相同,但只要采用统一的上层协议(TCP/IP)就可以通过Internet