RecyclerView的下拉刷新和下拉加載


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

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

下面寫一下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:

 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等

 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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM