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 }