Android——XRecyclerView实现上拉下拉,多条目布局

来源:互联网 发布:java抽象类构造函数 编辑:程序博客网 时间:2024/06/05 05:17

Android——XRecyclerView实现上拉下拉,多条目布局

本篇主要是为实现上拉下拉,多条目布局。
XRecyclerView是对RecyclerView的再次封装,主要提供了刷新、加载功能。
与RecyclerView相比,主要是在适配器Adapter中做出了修改。

①:我们需要导入新的依赖包:
//bufferknifecompile 'com.jakewharton:butterknife:7.0.1'//OKhttp3 compile 'com.squareup.okio:okio:1.5.0'    compile 'com.squareup.okhttp3:okhttp:3.2.0'    compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'//XRecyclerViewcom.jcodecraeer:xrecyclerview:1.3.2'  //bannner    compile 'com.github.bumptech.glide:glide:3.5.2'    compile files('libs/universal-image-loader-1.9.3.jar')    compile files('libs/gson-2.3.1.jar')
②布局文件中原来RecyclerView用的是:<android.support.v7.widget.RecyclerView /> XRecyclerView用的是<com.jcodecraeer.xrecyclerview.XRecyclerView />
  <com.jcodecraeer.xrecyclerview.XRecyclerView        android:id="@+id/id_recyclerview"        android:divider="#ffff0000"        android:dividerHeight="10dp"        android:layout_width="match_parent"        android:layout_height="match_parent" />
③:我们在适配器中多添加了1个方法(与RecyclerView的适配器相比)getItemViewType()方法,主要是用来判断哪个布局。我的效果为第一个为Banner轮播图,剩下的全为LinearLayoutManager布局。
package adapter;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;import com.dabin.sanzhou.R;import com.nostra13.universalimageloader.core.ImageLoader;import com.youth.banner.Banner;import java.util.ArrayList;import java.util.List;import app.GlideImageLoader;import bean.NewBase;/** * Created by Dabin */public class SongAdapter extends RecyclerView.Adapter {    private int TYPE_ONE = 0;    private int TYPE_TWO = 1;    MyViewHolder myViewHolder;    private Context context;    private List<NewBase.SongListBean> song_list;    private List mylist = new ArrayList();    //构造方法,主要是用来传入数据    public SongAdapter(Context context, List<NewBase.SongListBean> song_list) {        this.context = context;        this.song_list = song_list;    }    //在oncreateViewHolder中,利用getItemViewType()方法进行判断,得到每个条目的ViewHolder    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        if(getItemViewType(viewType) == TYPE_ONE){            myViewHolder = new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.songa_item, parent, false));            return myViewHolder;        }else{            MyViewHoldertwo myViewHoldertwo = new MyViewHoldertwo(LayoutInflater.from(context).inflate(R.layout.songb_item, parent, false));            return  myViewHoldertwo;        }    }    //在onBindViewHolder中,也利用getItemType()得到相对应的ViewHolder,给它里面的控件赋值    @Override    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {        if (getItemViewType(position) == TYPE_ONE) {            MyViewHolder holderone = (MyViewHolder) holder;            for (int i = 0; i < song_list.size(); i++) {                mylist.add(song_list.get(i).getPic_big());            }            holderone.mybanner.setImageLoader(new GlideImageLoader());            holderone.mybanner.setImages(mylist);            holderone.mybanner.start();        }else{            MyViewHoldertwo holdertwo = (MyViewHoldertwo) holder;            ImageLoader.getInstance().displayImage(song_list.get(position).getPic_small(),((MyViewHoldertwo) holder).imageView);            holdertwo.songname.setText(song_list.get(position).getTitle());            holdertwo.songauthor.setText(song_list.get(position).getAuthor());        }    }    //传过来数据的长度    @Override    public int getItemCount() {        return song_list.size();    }    //第一个ViewHolder    // ViewHolder 1    class MyViewHolder extends RecyclerView.ViewHolder {        Banner mybanner;        public MyViewHolder(View itemView) {            super(itemView);            mybanner = itemView.findViewById(R.id.mybanner);        }    }    //第二个ViewHolder    // ViewHolder 2    class MyViewHoldertwo extends RecyclerView.ViewHolder{        ImageView imageView;        TextView songname;        TextView songauthor;        public MyViewHoldertwo(View itemView) {            super(itemView);            imageView = itemView.findViewById(R.id.songb_item_image);            songname = itemView.findViewById(R.id.song_name);            songauthor = itemView.findViewById(R.id.song_author);        }    }    //getItemViewType方法,主要是用来进行多条目判断的,那几个数据用这个ViewHolder,其他的数据用那个Viewholder。    @Override    public int getItemViewType(int position) {        if (position == TYPE_ONE) {            return TYPE_ONE;        } else {            return TYPE_TWO;        }    }}
④在.java文件中: OKhttp请求是封装好的类,源码中有。setLoadingListener()方法中onRefresh为上拉刷新,onLoadMore为下拉加载。
package com.dabin.sanzhou;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.StaggeredGridLayoutManager;import com.jcodecraeer.xrecyclerview.XRecyclerView;import java.io.IOException;import java.util.List;import adapter.SongAdapter;import bean.NewBase;import butterknife.Bind;import butterknife.ButterKnife;import okhttp3.Call;import utils.GsonObjectCallback;import utils.OkHttp3Utils;public class SongActivity extends AppCompatActivity {    @Bind(R.id.id_recyclerview)    XRecyclerView idRecyclerview;    private String path = "http://tingapi.ting.baidu.com/v1/restserver/ting?method=baidu.ting.billboard.billList&type=";    private int page = 1;    private String path1 = "&size=10&offset=0";    List<NewBase.SongListBean> song_list;    SongAdapter songAdapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_song);        ButterKnife.bind(this);        idRecyclerview.setLayoutManager(new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL));        getData(path + page + path1);        //XRecyclerView 的监听方法        idRecyclerview.setLoadingListener(new XRecyclerView.LoadingListener() {            //刷新            @Override            public void onRefresh() {                //refresh data here                getData(path + 1 + path1);                idRecyclerview.refreshComplete();//停止刷新            }            //加载            @Override            public void onLoadMore() {                // load more data here                page += 1;                getData(path + page + path1);                idRecyclerview.loadMoreComplete();//停止加载            }        });    }    //OKhttp3网络请求,我用的是封装好的okhttp,在源码处下载    public void getData(String urll) {        OkHttp3Utils.doGet(urll, new GsonObjectCallback<NewBase>() {            @Override            public void onUi(NewBase newBase) {                song_list = newBase.getSong_list();                songAdapter = new SongAdapter(SongActivity.this, song_list);                idRecyclerview.setAdapter(songAdapter);            }            @Override            public void onFailed(Call call, IOException e) {            }        });    }}

源码地址:https://github.com/Dabinai/XRecyclerView

阅读全文
0 0
原创粉丝点击