ListView中adapter的简单封装
2017-10-11 17:46
330 查看
一个项目中要是使用listview的场景较多的时候,会创建多个adapter和viewholder。所以将adapter和viewholde写成通用的就可以了,具体操作如下面的代码所示:
封装ViewHolder类
public class ViewHolder { private SparseArray<View> mViews; private View mConvertView; private Context context; public ViewHolder(Context context, ViewGroup parent, int layoutId, int position) { this.context = context; this.mViews = new SparseArray<View>(); mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false); mConvertView.setTag(this); } public static ViewHolder get(Context context, View convertView, ViewGroup parent, int layoutId, int position) { if (convertView == null) { return new ViewHolder(context, parent, layoutId, position); } return (ViewHolder) convertView.getTag(); } /** * 通过控件id找到对应的view * * @param viewId * @param <T> * @return */ 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 View getConvertView() { return mConvertView; } /** * 为TextView设置字符串 * * @param viewId * @param text * @return */ public ViewHolder setText(int viewId, String text) { TextView tv = getView(viewId); tv.setText(text); return this; } /** * 为iamge设置网络图片 * * @param viewId * @param uri * @return */ //compile 'com.github.bumptech.glide:glide:3.6.1' public ViewHolder setImageByUri(int viewId, String uri) { ImageView view = getView(viewId); Glide.with(context).load(uri).into(view); return this; } /** * 为image设置本地图片 * * @param viewId * @param DrawbleId * @return */ public ViewHolder setImageResource(int viewId, int DrawbleId) { ImageView view = getView(viewId); view.setImageResource(DrawbleId); return this; } /** * 为控件设置点击事件 * * @param viewId * @param listener * @return */ public ViewHolder setOnClickListener(int viewId, View.OnClickListener listener) { View view = getView(viewId); view.setOnClickListener(listener); return this; } }
封装的listAdapter
public abstract class ListAdapter<T> extends BaseAdapter { public Context context; public ArrayList<T> data; public LayoutInflater inflater; public int layoutId; public ListAdapter(Context context, ArrayList<T> data,int layoutId){ this.inflater = LayoutInflater.from(context); this.layoutId = layoutId; this.context = context; this.data = data; }; public ListAdapter(Context context, ArrayList data) { } @Override public int getCount() { return data.size(); } @Override public T getItem(int i) { return data.get(i); } @Override public long getItemId(int i) { return 0; } @Override public int getItemViewType(int position) { return super.getItemViewType(position); } @Override public View getView(int i, View view, ViewGroup viewGroup) { final ViewHolder viewHolder = getViewHolder(i, view, viewGroup); convert(viewHolder, getItem(i),i); return viewHolder.getConvertView(); } public abstract void convert(ViewHolder helper, T item,int position); private ViewHolder getViewHolder(int position, View convertView, ViewGroup parent) { return ViewHolder.get(context, convertView, parent, layoutId, position); } }
Bean类设置的参数是条目中的属性
public class Bean { private String msg; private String photo; public Bean(String msg) { this.msg = msg; } public Bean(String msg, String photo) { this.msg = msg; this.photo = photo; } public String getPhoto() { return photo; } public void setPhoto(String photo) { this.photo = photo; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; }
activity_main.xml文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
item_list.xml文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center"> <TextView android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:layout_gravity="center" android:padding="10dp"/> <ImageView android:id="@+id/iv" android:layout_width="50dp" android:layout_height="50dp" android:layout_marginRight="20dp" android:scaleType="fitXY"/> </LinearLayout>
MainActivity中代码的使用,由于用到了网络图片,需要在清单文件中加上
添加的依赖:compile ‘com.github.bumptech.glide:glide:3.6.1’
public class MainActivity extends AppCompatActivity { private ArrayList<Bean> list; private String photo = "https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=1188238263,844192284&fm=27&gp=0.jpg"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); ListView lv = (ListView) findViewById(R.id.lv); initData(); lv.setAdapter(new ListAdapter<Bean>(this, list, R.layout.item_list) { @Override public void convert(ViewHolder helper, Bean item, int position) { helper.setText(R.id.tv, item.getMsg()); helper.setImageByUri(R.id.iv, item.getPhoto()); } }); } private void initData() { list = new ArrayList<>(); for (int i = 0; i < 50; i++) { list.add(new Bean("第" + i + "行的数据是" + i, photo)); } } }
recycleview也简单的封装了一下
ViewHolder类的封装
public class ViewHolder extends RecyclerView.ViewHolder { private SparseArray<View> mViews; private View mConvertView; private Context mContext; public ViewHolder(Context context, View itemView, ViewGroup parent) { super(itemView); mContext = context; mConvertView = itemView; mViews = new SparseArray<View>(); } public static ViewHolder get(Context context, ViewGroup parent, int layoutId) { View itemView = LayoutInflater.from(context).inflate(layoutId, parent, false); ViewHolder holder = new ViewHolder(context, itemView, parent); return holder; } /** * 通过viewId获取控件 * * @param viewId * @return */ 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; } }
RecycleAdapter类的封装
public abstract class RecycleAdapter<T> extends Adapter { protected Context mContext; protected int mLayoutId; protected List<T> mDatas; protected LayoutInflater mInflater; public RecycleAdapter(Context context, int layoutId, List<T> datas) { mContext = context; mInflater = LayoutInflater.from(context); mLayoutId = layoutId; mDatas = datas; } @Override public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) { ViewHolder viewHolder = ViewHolder.get(mContext, parent, mLayoutId); return viewHolder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { convert((ViewHolder) holder, mDatas.get(position)); } public abstract void convert(ViewHolder holder, T t); @Override public int getItemCount() { return mDatas.size(); } }
使用场景
rcv.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)); rcv.setAdapter(new RecycleAdapter<Bean>(this,R.layout.item_adapter,beanList) { @Override public void convert(ViewHolder holder, Bean bean) { TextView view = holder.getView(R.id.tv_msg); view.setText(bean.getMsg()); } });
相关文章推荐
- Android-对ListView的Adapter的一种简单封装
- 为了灵活使用listView,封装了BaseAdapter
- ListView添加图片和文字效果之SimpleAdapter简单实例
- ListView之BaseAdapter的用法简单案例(四)
- 超级简单RecycleViewAdapter的封装-支持多视图,多点击回调
- RecyclerView.Adapter 的简单封装
- Adapter的简单封装
- android组件ListView之ArrayAdapter简单使用
- BaseAdapter的简单封装
- 简单的封装BaseRecycleviewAdapter
- listView和adapter的简单应用
- Android Adapter的简单封装
- Android 对ListView和RecyclerView的两个BaseAdapter封装分享
- ListView多布局Adapter封装
- 使用RecycleView时候的adapter的简单封装
- android代码优化----ListView中自定义adapter的封装
- Android-万能 Adapter 封装(实现textview,imageView 的简单封装,封装 jar 包)
- Android 中ListView,BaseAdapter,CursorAdapter等的简单总结
- 简单实现listview可选择的列表(不用重写adapter)
- ListView 与 SimpleAdapter的简单用法