Android 之BaseRecyclerAdapter简单封装之路
2017-02-20 15:37
537 查看
1。使用Recyclerview代替Listview做列表数据,已经是主流了,虽然Recyclerview提供了很强大的功能,但我就得小小遗憾的是居然没有点击事件,每次都需要人为的定义接口来实现点击事件,所以讲到这里,既然封装,那就从最简单的点击事件开始吧。。。
2。发现,我们每使用一个adapter的时候,就需要一个对应ViewHolder操作。。。
这一步巧妙的把RvListener放进来了
3,最后就是adapter的定义
使用:定义一个RvDemoAdapter extends RvAdapter
两个item布局文件:
item_title.xml
item_content.xml
Maintivity
一个实体类
效果图:
//RecyclerView的item点击事件 public interface RvListener { void onItemClick(int id, int position); }
2。发现,我们每使用一个adapter的时候,就需要一个对应ViewHolder操作。。。
这一步巧妙的把RvListener放进来了
public abstract class RvHolder<T> extends RecyclerView.ViewHolder { protected RvListener mListener; public RvHolder(View itemView, int type, RvListener listener) { super(itemView); this.mListener = listener; //这一步巧妙的把RvListener放进来了,这一步巧妙的把RvListener放进来了,这一步巧妙的把RvListener放进来了 itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mListener.onItemClick(v.getId(), getAdapterPosition()); } }); } public abstract void bindHolder(T t, int position); }
3,最后就是adapter的定义
public abstract class RvAdapter<T> extends RecyclerView.Adapter<RvHolder>{ protected List<T> list; protected Context mContext; protected RvListener listener; protected LayoutInflater mInflater; public RvAdapter(Context context, List<T> list, RvListener listener) { mContext = context; mInflater = LayoutInflater.from(context); this.list = list; this.listener = listener; } @Override public RvHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = mInflater.inflate(getLayoutId(viewType), parent, false); return getHolder(view, viewType); } protected abstract int getLayoutId(int viewType); @Override public void onBindViewHolder(RvHolder holder, int position) { holder.bindHolder(list.get(position), position); } @Override public int getItemCount() { return list.size(); } @Override public int getItemViewType(int position) { return 0; } /** * 刷新数据 * @param data */ public void updata(List<T> data){ this.list=data; notifyDataSetChanged(); } /** * 刷新数据 */ public void udaptanotify(){ list.clear(); notifyDataSetChanged(); } protected abstract RvHolder getHolder(View view, int viewType); }
使用:定义一个RvDemoAdapter extends RvAdapter
public class RvDemoAdapter extends RvAdapter<UserInfo> { public RvDemoAdapter(Context context, List<UserInfo> list, RvListener listener) { super(context, list, listener); } @Override protected int getLayoutId(int viewType) { return viewType == 0 ? R.layout.item_title : R.layout.item_content; } @Override public int getItemViewType(int position) { return list.get(position).isTitle() ? 0 : 1; } @Override protected RvHolder getHolder(View view, int viewType) { return new RvDemoHolder(view, viewType, listener); } class RvDemoHolder extends RvHolder<UserInfo> { TextView title; TextView content; public RvDemoHolder(View itemView, int type, RvListener listener) { super(itemView, type, listener); switch (type) { case 0: title = (TextView) itemView.findViewById(R.id.title); break; case 1: content = (TextView) itemView.findViewById(R.id.content); break; } } @Override public void bindHolder(UserInfo userInfo, int position) { int itemViewType = RvDemoAdapter.this.getItemViewType(position); switch (itemViewType) { case 0: title.setText(userInfo.getName()); break; case 1: content.setText(userInfo.getName()); break; } } } }
两个item布局文件:
item_title.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:id="@+id/ll_title" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="45dp" android:gravity="center" android:text="...."/> </LinearLayout>
item_content.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:gravity="center" android:id="@+id/ll_content" android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:layout_width="100dp" android:layout_height="100dp" android:src="@mipmap/ic_launcher"/> <TextView android:id="@+id/content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="....."/> </LinearLayout>
Maintivity
public class MainActivity extends AppCompatActivity { private RecyclerView mRecyclerView; private List<UserInfo> datas=new ArrayList<>(); private RvDemoAdapter mRvDemoAdapter; private GridLayoutManager mManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { mRecyclerView = (RecyclerView) findViewById(R.id.RecyclerView); initData(); } private void initData() { for (int i = 0; i <10 ; i++) { UserInfo info=new UserInfo(); info.setName("title"+i); info.setTitle(true); datas.add(info); for (int j = 0; j <6 ; j++) { UserInfo infos=new UserInfo(); infos.setName("第"+i+"item"+j); datas.add(infos); } } initAdapter(); } private void initAdapter() { mManager=new GridLayoutManager(this,3); mManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { return datas.get(position).isTitle()? 3 :1; } }); mRvDemoAdapter=new RvDemoAdapter(this, datas, new RvListener() { @Override public void onItemClick(int id, int position) { switch (id){ case R.id.ll_title: Toast.makeText(MainActivity.this, datas.get(position).getName(), Toast.LENGTH_SHORT).show(); break; case R.id.ll_content: Toast.makeText(MainActivity.this, datas.get(position).getName(), Toast.LENGTH_SHORT).show(); break; } } }); mRecyclerView.setLayoutManager(mManager); mRecyclerView.setAdapter(mRvDemoAdapter); } }
一个实体类
public class UserInfo { private String name; private String content; private boolean isTitle; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public boolean isTitle() { return isTitle; } public void setTitle(boolean title) { isTitle = title; } }
效果图:
相关文章推荐
- Android开发之ButterKnife,GreenDao简单运用,以及推荐并使用一个好用的开源库BaseRecyclerViewAdapterHelper。
- Android 对ListView和RecyclerView的两个BaseAdapter封装分享
- Android - 是时候为自己封装一个BaseRecyclerAdapter了
- Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法与有用代码片段
- Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法与有用代码片段
- Android:BaseRecyclerViewAdapter(RecyclerView 之 BaseAdapter)
- RecyclerView.Adapter的封装之路
- Android开源之BaseRecyclerViewAdapterHelper(持续更新!)
- Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法与有用代码片段
- [android开发]封装BaseAdapter, 简便代码
- android: BaseAdapter和ListView简单运用(08)
- Android-万能 Adapter 封装(实现textview,imageView 的简单封装,封装 jar 包)
- Android RecyclerView Adapter及Holder的封装【原创】
- Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法与有用代码片段(转)
- RecyclerView.Adapter 的简单封装
- Android深入浅出系列之实例应用—简单的手指拖动图片,图片滑来滑去显示应用Gallery和BaseAdapter以及ImageView的使用
- Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法与有用代码片段
- android 简单的adapter封装
- Android深入浅出系列之实例应用—简单的手指拖动图片,图片滑来滑去显示应用Gallery和BaseAdapter以及ImageView的使用
- BaseAdapter的简单封装