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 }