通用的RecyclerView适配器.
来源:互联网 发布:java mvc框架有哪些 编辑:程序博客网 时间:2024/05/22 18:58
RecyclerView的功能就不多说,非常的强大,现在开发基本已经取代了ListView,但是它也有些不好的地方,比如,没有提供item的点击事件没有直接地提供addHeaderView和addFooterView,今天呢,就尝试着自己封装一个通用的RecyclerView.Adapter.使得其在实际开发中简化代码,易扩展,提高我们的开发效率,下面开始进入正题.
1,通用的ViewHolder
1,我们都知道,RecyclerView必须要使用ViewHolder模式,在我们使用的过程中,都需要去建立一个新的ViewHolder,然后作为泛型传入Adapter,那么问题来了,我们每次都要新建一个ViewHolder吗?其实是不需要的,那怎么解决这个问题呢?我们可以写一个通用的ViewHoler.
(1)首先我们确定下ViewHolder的主要的作用,实际上是通过成员变量存储对应的convertView中需要操作的字View,避免每次findViewById,从而提升运行的效率。代码如下
package com.example.mysample.common;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.text.TextUtils;import android.util.SparseArray;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.EditText;import android.widget.FrameLayout;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.RelativeLayout;import android.widget.TextView;/** * Created by Administrator on 2016/9/27. */public class ViewHolder extends RecyclerView.ViewHolder { private Context mContext; public View getItemView() { return mConvertView; } private View mConvertView; private SparseArray<View> mViews; public ViewHolder(Context context, View itemView, ViewGroup parent) { super(itemView); mContext = context; mConvertView = itemView; mViews = new SparseArray<>(); } public ViewHolder(Context context, View itemView) { super(itemView); mContext = context; mConvertView = itemView; mViews = new SparseArray<>(); } public static ViewHolder createViewHolder(Context context, ViewGroup parent, int layoutId){ View itemView = LayoutInflater.from(context).inflate(layoutId,parent,false); ViewHolder holder = new ViewHolder(context,itemView,parent); return holder; } public static ViewHolder createViewHolder(Context context, View itemView){ ViewHolder holder = new ViewHolder(context, itemView); return holder; } public <T extends View> T getView(int viewId){ View view = mViews.get(viewId); if (view == null){ view = mConvertView.findViewById(viewId); mViews.put(viewId,view); } return (T)view; } public TextView getTextView(int viewId){ TextView textView = getView(viewId); return textView; } public ViewHolder setText(int viewId,String str){ if (!TextUtils.isEmpty(str)){ TextView tv = getTextView(viewId); tv.setText(str); } return this; } public EditText getEditView(int viewId){ EditText editText= getView(viewId); return editText; } public ViewHolder setEditText(int viewId,String str){ if (!TextUtils.isEmpty(str)){ EditText tv = getEditView(viewId); tv.setText(str); } return this; } public ImageView getImageView(int viewId){ ImageView imageView= getView(viewId); return imageView; } public Button getButton(int viewId){ Button btn= getView(viewId); return btn; } public ViewHolder setButtonText(int viewId,String str){ if (!TextUtils.isEmpty(str)){ Button btn = getButton(viewId); btn.setText(str); } return this; } public LinearLayout getLinearLayout(int viewId){ LinearLayout layout= getView(viewId); return layout; } public RelativeLayout relativeLayout(int viewId){ RelativeLayout layout= getView(viewId); return layout; } public FrameLayout frameLayout(int viewId){ FrameLayout layout= getView(viewId); return layout; } public ViewHolder setOnClickListener(int viewId, View.OnClickListener listener){ getView(viewId).setOnClickListener(listener); return this; } }
是不是很简单呢,我们的ViewHolder继承自RecyclerView.ViewHolder,内部通过SparseArray来缓存我们itemView内部的子View,从而得到一个通用的ViewHolder.
ok,有了通用的ViewHolder之后,我们的通用的Adapter分分钟就出来了。
2、通用的Adapter
具体的看代码:
package com.example.mysample.common;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;import java.util.List;/** * Created by Administrator on 2016/9/27. */public abstract class CommonRecyclerAdapter<T> extends RecyclerView.Adapter<ViewHolder> { protected Context mContext; protected List<T> mDatas; protected OnItemOnClickListener mOnClickListener; protected OnItemOnLongClickListener mLongClickListener; public void setOnItemClickListener(OnItemOnClickListener onClickListener) { mOnClickListener = onClickListener; } public void setOnItemLongClickListener(OnItemOnLongClickListener longClickListener) { mLongClickListener = longClickListener; } public CommonRecyclerAdapter(Context context, List<T> datas) { mContext = context; mDatas = datas; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { ViewHolder viewHolder = ViewHolder.createViewHolder(mContext,parent,bindItemLayout()); return viewHolder; } @Override public void onBindViewHolder(ViewHolder holder, final int position) { T t = mDatas.get(position); if (t != null){ convert(holder,t); } holder.getItemView().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mOnClickListener != null){ mOnClickListener.onItemOnClickListener(position,v); } } }); holder.getItemView().setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { if ( mLongClickListener != null){ mLongClickListener.onItemOnLongClickListener(position,v); } return false; } }); } public abstract void convert(ViewHolder viewHolder ,T t); public abstract int bindItemLayout(); @Override public int getItemCount() { return mDatas.size(); }}
item的点击事件和长按的点击事件,分别提供两个接口
public interface OnItemOnClickListener { void onItemOnClickListener(int position,View itemView);}public interface OnItemOnLongClickListener { void onItemOnLongClickListener(int position, View itemView);}
3接下来我们就可以使用了
1,新一个Uese类
package com.example.mysample;import java.io.Serializable;/** * Created by Administrator on 2016/9/27. */public class User implements Serializable { private int id; private String userName; private String address; public User(){ } public User(int id, String userName, String address) { this.id = id; this.userName = userName; this.address = address; } @Override public String toString() { return "User{" + "id=" + id + ", userName='" + userName + '\'' + ", address='" + address + '\'' + '}'; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; }}
2,新建一个MyAdapter 继承CommonRecyclerAdapter,User作为泛型传入:
package com.example.mysample;import android.content.Context;import android.view.View;import android.widget.Toast;import com.example.mysample.common.CommonRecyclerAdapter;import com.example.mysample.common.ViewHolder;import java.util.List;/** * Created by Administrator on 2016/9/27. */public class MyAdapter extends CommonRecyclerAdapter<User> { public MyAdapter(Context context, List<User> datas) { super(context, datas); } @Override public void convert(ViewHolder viewHolder, final User user) { viewHolder.setText(R.id.tv_address,user.getAddress()); viewHolder.setText(R.id.tv_userName,user.getUserName()); viewHolder.setOnClickListener(R.id.tv_userName, new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(mContext,user.getUserName(),Toast.LENGTH_SHORT).show(); } }); } /** * 绑定item的布局 * @return */ @Override public int bindItemLayout() { return R.layout.item_layout; }}
3,在Activity中测试.
package com.example.mysample;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.View;import android.widget.Toast;import com.example.mysample.common.OnItemOnClickListener;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity { private RecyclerView mRecyclerView; private List<User> mList; private MyAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { mList = new ArrayList<>(); for (int i = 0 ;i<20 ;i++){ User user = new User(); user.setAddress( i% 2==0 ? "深圳"+i:"北京"+i); user.setUserName( i% 2==0 ? "周杰伦"+i:"昆凌"+i); mList.add(user); } mAdapter = new MyAdapter(this,mList); mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView); RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false); mRecyclerView.setLayoutManager(layoutManager); mRecyclerView.setAdapter(mAdapter); mAdapter.setOnItemClickListener(new OnItemOnClickListener() { @Override public void onItemOnClickListener(int position, View itemView) { Toast.makeText(MainActivity.this,mList.get(position).toString(),Toast.LENGTH_SHORT).show(); } }); }}
那么这样的话,今天的博客就结束了谢谢大家
- 通用的RecyclerView适配器.
- RecyclerView通用适配器的实现
- 打造RecyclerView的通用适配器
- 通用的RecyclerView Adapter适配器
- RecyclerView的通用适配器的高级使用
- Android RecyclerView通用适配器
- RecyclerView通用适配器
- android RecyclerView 通用适配器
- RecyclerView系列之一:打造RecyclerView通用的适配器BaseAdapter
- listview通用适配器和RecyclerView通用适配器
- Android RecyclerView简单通用适配器
- 一个适用于ListView/GridView/RecyclerView的通用适配器
- RecyclerView通用适配器Adapter,对Adapter的封装
- 为你的RecyclerView.Adapter添加通用DiffUtil适配器
- 一个追求通用调用极简的RecyclerView适配器
- recyclerview的适配器功能
- RecyclerView的适配器
- recyclerView 的万能适配器
- svn更新失败,报E175002
- 空间数据聚类 DBSCAN
- CodeForces 6B President's Office
- 深入理解Android网络-Note
- JavaScript数组定义和常用运算符
- 通用的RecyclerView适配器.
- Java集合——LinkedHashMap源码详解
- startActivityForResult
- 求木板最大拼接矩形
- java-JDBC-ResultSet详解(java数据库操作)
- promise架构和node.js的promise用法
- Linux_htop安装过程记录
- VS code 中C/C++ 的代码格式化
- 2016/09/27 20:08 The Best of Yourth