RecyclerView的下拉刷新和下拉加載

RecyclerView是比listview更強悍的一個控件,樣式能夠是列表式,瀑布式,或者是網格式。java

能夠參照Hongyang大神的博客:http://blog.csdn.net/lmj623565791/article/details/45059587。android

下面寫一下RecyclerView的下拉刷新和上拉加載。這是用到第三方一個大神寫好的。首先進行依賴:網絡

1    compile 'com.android.support:recyclerview-v7:23.1.1'
2    compile 'com.chanven.lib:cptr:1.0.0'

主佈局文件是:框架

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools" 
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent" 
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin"
 9     tools:context="com.didiincubator.recycleview.MainActivity">
10     <com.chanven.lib.cptr.PtrClassicFrameLayout
11         android:id="@+id/ptr_class"
12         android:layout_width="match_parent"
13         android:layout_height="match_parent">
14         <android.support.v7.widget.RecyclerView
15             android:id="@+id/recycleView"
16             android:layout_width="match_parent"
17             android:layout_height="match_parent"
18             >
19         </android.support.v7.widget.RecyclerView>
20     </com.chanven.lib.cptr.PtrClassicFrameLayout>
21 
22 </RelativeLayout

item佈局文件,比較簡單,就寫了一個Textview:ide

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:orientation="vertical" 
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent">
 5 <TextView
 6     android:id="@+id/textView"
 7     android:layout_width="match_parent"
 8     android:layout_height="match_parent"/>
 9     <LinearLayout
10         android:layout_width="match_parent"
11         android:layout_height="1px"
12         android:background="#eeefff"
13         ></LinearLayout>
14 </LinearLayout>

先寫適配器吧,RecyclerView的適配器和ListView略不同,可是大概仍是差很少的:佈局

/**
* 1先建立MyViewHolder而且繼承RecyclerView.ViewHodler
* 2.適配器繼承RecyclerView.Adapter,而且寫上泛型<>
* 3.實現裏面的方法。在MyViewHolder onCreateViewHolder()方法中綁定佈局
* 4.在Binder方法中設置item中的內容,寫上業務邏輯,監聽等內容。
*/

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{ List<String> mList; Context mContext; LayoutInflater inflater; MyAdapter(List<String> mList,Context context){ this.mList=mList; this.mContext=context; inflater=LayoutInflater.from(mContext); } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { /** * 1.綁定佈局 * */ View view=inflater.inflate(R.layout.item,parent,false); MyViewHolder myViewHolder=new MyViewHolder(view); return myViewHolder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { MyViewHolder viewHolder= (MyViewHolder) holder; viewHolder.mTextView.setText(mList.get(position)); viewHolder.mTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(mContext, "a", Toast.LENGTH_SHORT).show(); } }); } @Override public int getItemCount() { return mList==null ? 0 : mList.size(); } public class MyViewHolder extends RecyclerView.ViewHolder { TextView mTextView; public MyViewHolder(View itemView) { super(itemView); mTextView= (TextView) itemView.findViewById(R.id.textView); } } }

 而後就剩下在主佈局裏:綁定適配器,請求數據等,固然請求數據是不能在ui線程中,可是網絡請求框架請求數據能夠直接在主線程中直接進行請求,如nohttp,xutils3等post

 1 public class MainActivity extends AppCompatActivity {
 2    private List<String> mList=new ArrayList<>();
 3     RecyclerView mRecyclerView;
 4     MyAdapter myAdapter;//本身定義的適配器
 5     RecyclerAdapterWithHF mAdapterWithHF;//第三方的適配器,我以爲是進行刷新和加載而設置的
 6     PtrClassicFrameLayout mFrameLayout;
 7 
 8     @Override
 9     protected void onCreate(Bundle savedInstanceState) {
10         super.onCreate(savedInstanceState);
11         setContentView(R.layout.activity_main);
12         initView();
13         //initData();
14         myAdapter=new MyAdapter(mList,this);
15         mAdapterWithHF=new RecyclerAdapterWithHF(myAdapter);//自帶的適配器,帶刷新和加載
16         mRecyclerView.setAdapter(mAdapterWithHF);
17         initListener();
18     }
19 
20     private void initData() {
21         for (int i=0;i<10;i++){
22             mList.add("數據"+i);
23         }
24     }
25 
26     private void initView() {
27         mRecyclerView= (RecyclerView) findViewById(R.id.recycleView);
28         mFrameLayout = (PtrClassicFrameLayout) findViewById(R.id.ptr_class);
29         mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
30 
31     }
32     private void initListener() {
33         mFrameLayout.setLastUpdateTimeRelateObject(this);//設置刷新支持時間
34         mFrameLayout.setResistance(1.7f);
35         mFrameLayout.setDurationToCloseHeader(1000);
36         // 默認爲false
37         mFrameLayout.setPullToRefresh(false);
38         // 默認爲true
39         mFrameLayout.setKeepHeaderWhenRefresh(true);
40         //進入Activity就進行自動下拉刷新
41         mFrameLayout.postDelayed(new Runnable() {
42             @Override
43             public void run() {
44                 mFrameLayout.autoRefresh();
45             }
46         }, 100);
47         //下拉刷新
48         mFrameLayout.setPtrHandler(new PtrDefaultHandler() {
49             @Override
50             public void onRefreshBegin(PtrFrameLayout frame) {
51                 mList.clear();
52                 initData();//模擬加載數據
53                 //模擬聯網,延遲更新數據
54                 new Handler().postDelayed(new Runnable() {
55                     @Override
56                     public void run() {
57                         mAdapterWithHF.notifyDataSetChanged();//適配器更新數據
58                         mFrameLayout.refreshComplete();//
59                         mFrameLayout.setLoadMoreEnable(true);
60                     }
61                 },1000);
62             }
63         });
64         //上拉加載
65         mFrameLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
66             @Override
67             public void loadMore() {
68                 //模擬網絡延遲
69                 new Handler().postDelayed(new Runnable() {
70                     @Override
71                     public void run() {
72                         initData();//模擬加載數據
73                         mAdapterWithHF.notifyDataSetChanged();
74                         mFrameLayout.loadMoreComplete(true);
75                     }
76                 },1000);
77             }
78         });
79     }
80 }
相關文章
相關標籤/搜索