RecyclerView多布局、万能适配器使用及XRecyclerView刷新方法

RecyclerView多布局、万能适配器使用及XRecyclerView刷新方法

  • 多布局
  • 万能适配器
  • XRecyclerView

多布局

昨天写过一个RecyclerView的简单用法,今天给大家写一下RecyclerView的多布局用法

首先在我们的数据源中,定义一个int类型或其他类型的参数,用于判断布局类型

我这里简单写一个Bean类 用于存储数据


public class Bean {
    String id;
    String title;
    int i;
    public Bean(String id, String title,int i) {
        this.id = id;
        this.title = title;
        this.i=i;
    }
    
}

然后 在适配器中重写三个昨天的方法,再重写一个getItemViewType方法 该方法的返回值是onCreateViewHolder方法的int类型参数

具体代码如下:

public class RVAdapter_Duo extends RecyclerView.Adapter<RVAdapter_Duo.RVHolder> {
    Context context;
    ArrayList<Bean> datas;


    public RVAdapter_Duo(Context context, ArrayList<Bean> datas) {
        this.context = context;
        this.datas = datas;
    }

    @NonNull
    @Override
    public RVHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        Log.d("###", "onCreateViewHolder: "+datas.get(i).title+"---"+datas.get(i).i);
        if(datas.get(i).i%2==0){                              //通过getItemViewType返回的参数进行判断  分别给布局
            Log.d("###", "onCreateViewHolder: "+1);				
            View view= LayoutInflater.from(context).inflate(R.layout.item2,viewGroup,false);
            return new RVHolder(view);

        }else {
            Log.d("###", "onCreateViewHolder: "+2);

            View view= LayoutInflater.from(context).inflate(R.layout.item,viewGroup,false);
            return new RVHolder(view);
        }
    }

    @Override
    public int getItemViewType(int position) {
		//可以在这个方法中进行判断  也可以像我写的这样返回给onCreateViewHolder中判断
        return position;  
    }

    @Override
    public void onBindViewHolder(@NonNull RVHolder rvHolder, final int i) {

        rvHolder.textView.setText(datas.get(i).title);
        Glide.with(context).load(datas.get(i).id).into(rvHolder.imageView);

    }

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

    class RVHolder extends RecyclerView.ViewHolder{
        private TextView textView;
        private ImageView imageView;
        public RVHolder(@NonNull View itemView) {
            super(itemView);
            imageView=itemView.findViewById(R.id.wenziyi);
            textView=itemView.findViewById(R.id.wenzier);


        }
    }

}

Activity中代码不变,不会的朋友可以查找我前一天博客

效果:

RecyclerView多布局、万能适配器使用及XRecyclerView刷新方法_第1张图片

万能适配器

首先封装两个类 :

public class BaseRVHolder extends RecyclerView.ViewHolder {
    SparseArray<View> view=new SparseArray<>();

    public BaseRVHolder(@NonNull View itemView) {
        super(itemView);
    }
    public View getView(int id){
        View subview = view.get(id);
        if(subview==null){
            subview=itemView.findViewById(id);
            view.put(id,subview);
        }
        return subview;
    }

}


public abstract class BaseRVAdapter<T> extends RecyclerView.Adapter<BaseRVHolder> {
    ArrayList<T> datas= new ArrayList<>();
    Context context;

    public BaseRVAdapter(ArrayList<T> datas, Context context) {
        this.datas = datas;
        this.context = context;
    }

      public abstract int getLayoutId();
        public abstract void convertView(BaseRVHolder baseRVHolder,int i);

    @NonNull
    @Override
    public BaseRVHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View inflate = LayoutInflater.from(context).inflate(getLayoutId(), viewGroup, false);
        return new BaseRVHolder(inflate);
    }

    @Override
    public void onBindViewHolder(@NonNull BaseRVHolder baseRVHolder, int i) {
        convertView(baseRVHolder,i);
    }

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

然后重写一个类 继承BaseRVHolder 类


public class RVAdapter<Bean> extends BaseRVAdapter {
    ArrayList<com.example.work6_9.Bean> datas;
    Context context;
    public RVAdapter(ArrayList datas, Context context) {
        super(datas, context);
        this.context=context;
        this.datas=datas;
    }

    @Override
    public int getLayoutId() {
        return R.layout.item;
    }

    @Override
    public void convertView(BaseRVHolder baseRVHolder, int i) {
        ImageView imageView= (ImageView) baseRVHolder.getView(R.id.wenziyi);
        Glide.with(context).load(datas.get(i).id).into(imageView);
        TextView textView = (TextView) baseRVHolder.getView(R.id.wenzier);
        textView.setText(datas.get(i).title);
    }

}

XRecyclerView

导依赖 :

implementation ‘com.android.support:recyclerview-v7:28.0.0’
api(‘com.jcodecraeer:xrecyclerview:1.5.9’) {
exclude group: ‘com.android.support’
}

写布局文件
通过setLoadingListener方法监听下拉刷新上拉加载事件
其他用法与RecyclerView一样

public class MainActivity extends AppCompatActivity {
    XRecyclerView recyclerView;
    ArrayList<Bean> list;
    RVAdapter adapter;
    RVAdapter_Duo adapter2;
    int flag=1;

    Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Log.d("##","刷新");
            recyclerView.refreshComplete();
            adapter2.notifyDataSetChanged(); //刷新适配器
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView=findViewById(R.id.recycler);  //初始化布局
        final LinearLayoutManager manager=new LinearLayoutManager(this);
        manager.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(manager);   //设置布局
        DividerItemDecoration dividerItemDecoration=new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
        dividerItemDecoration.setDrawable(getDrawable(R.drawable.divider));  //设置分割线
        recyclerView.addItemDecoration(dividerItemDecoration);

        list=new ArrayList<>();
        myThread();
//        adapter=new RVAdapter(list,this);
        adapter2=new RVAdapter_Duo(this,list);
        recyclerView.setAdapter(adapter2);  //设置适配器




        recyclerView.setLoadingListener(new XRecyclerView.LoadingListener() {
            @Override
            public void onRefresh() {
                flag=1;
                myThread();

            }

            @Override
            public void onLoadMore() {
                flag++;
                myThread();
            }
        });




    }

    public void myThread(){
        new Thread(new Runnable() {  //下载数据
            @Override
            public void run() {
                String gson = HttpLoad.getGson("http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&page="+flag);
                try {
                    JSONObject jsonObject=new JSONObject(gson);
                    JSONArray data = jsonObject.getJSONArray("data");
                    for(int i = 0 ; i < data.length();i++){
                        JSONObject jsonObject1 = data.getJSONObject(i);
                        String id = jsonObject1.getString("pic");
                        String title = jsonObject1.getString("title");
                        Log.d("##",title);
                        Bean bean = new Bean(id, title,i);
                        list.add(bean);
                    }
                    Message obtain = Message.obtain();
                    handler.sendMessage(obtain);  //发送线程

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }



}

效果:
RecyclerView多布局、万能适配器使用及XRecyclerView刷新方法_第2张图片

RecyclerView多布局、万能适配器使用及XRecyclerView刷新方法_第3张图片

你可能感兴趣的:(Android)