超级封装BaseAdapter,让你省下千万行代码
2015-04-18 17:18
253 查看
首先打造超级Viewholder
打造超级BaseAdapter
使用范例
这是MainActivity
main.xml布局
CommonAdapter 源码:
listview_item.xml布局:
这是用用的Bean实体:
以上信息参考慕课网的hyman老师的视频,在此谢谢。
package com.ljh.powerfulladapter.util; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; public class CommonViewHolder { private int mPosition; /* * 用于存储holder里面的各个view,此集合比map效率高,但key必须为Integer */ private SparseArray<View> mViews; /** * 复用的view */ private View convertView; private CommonViewHolder(Context context,int position, int layoutId, ViewGroup parent) { this.mPosition = position; mViews = new SparseArray<View>(); convertView = LayoutInflater.from(context).inflate(layoutId, parent,false); convertView.setTag(this); } public static CommonViewHolder getInstance(Context context,int layoutId,int position, View convertView, ViewGroup parent) { if (convertView == null) { return new CommonViewHolder(context, position, layoutId, parent); } else { CommonViewHolder holder = (CommonViewHolder) convertView.getTag(); holder.mPosition = position; return holder; } } /** * 通过resourceId获取item里面的view * @param resourceId 控件的id * @return */ @SuppressWarnings("unchecked") public <T extends View> T getView(int resourceId) { View view = mViews.get(resourceId); if (view == null) { view = convertView.findViewById(resourceId); mViews.put(resourceId, view); } return (T) view; } /** * 为textview类型填充内容 * @param resourceId * @param text * @return CommonViewHolder */ public CommonViewHolder setText(int resourceId,CharSequence text ) { ((TextView) getView(resourceId)).setText(text); return this; } public CommonViewHolder setText(int resourceId,int resid ) { ((TextView) getView(resourceId)).setText(resid); return this; } /** * 为ImageView设置Bitmap * @param resourceId * @param bm * @return */ public CommonViewHolder setBitmap(int resourceId,Bitmap bm) { ((ImageView)getView(resourceId)).setImageBitmap(bm); return this; } public CommonViewHolder setImageDrawable(int resourceId,Drawable drawable) { ((ImageView)getView(resourceId)).setImageDrawable(drawable); return this; } public CommonViewHolder setImageResource(int resourceId,int resId) { ((ImageView)getView(resourceId)).setImageResource(resId); return this; } public View getConvertView() { return convertView; } /** * 获取当前item的位置 * @return */ public int getPosition() { return mPosition; } }
打造超级BaseAdapter
package com.ljh.powerfulladapter.util; import java.util.List; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import com.ljh.powerfulladapter.R; public abstract class CommonBaseAdapter<T> extends BaseAdapter { private Context mContext; private List<T> mDatas; public CommonBaseAdapter(Context context,List<T> datas) { this.mContext = context; this.mDatas = datas; } @Override public int getCount() { return mDatas.size(); } @Override public T getItem(int position) { return mDatas.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { CommonViewHolder holder = CommonViewHolder.getInstance(mContext, R.layout.listview_item, position, convertView, parent); convert(holder,mDatas.get(position)); return holder.getConvertView(); } /** * 填充holder里面控件的数据 * @param holder * @param bean */ public abstract void convert(CommonViewHolder holder,T bean); }
使用范例
这是MainActivity
public class MainActivity extends Activity { private ListView listView; private List<Bean> mDatas; // private MyAdapter adapter; private CommonAdapter commonAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initDatas(); initView(); regisetListener(); } @SuppressWarnings("deprecation") private void initDatas() { mDatas = new ArrayList<Bean>(); for (int i = 0 ; i < 20; i ++) { mDatas.add(new Bean("Android 新技术" + i, "android 新技术,可以让你走上人生高富贵道路,不信,就来学吧!", "1231212112" + i, new Date().toLocaleString())); } } private void initView() { listView = (ListView) findViewById(R.id.listview); // adapter = new MyAdapter(this, mDatas); // listView.setAdapter(adapter); commonAdapter = new CommonAdapter(this, mDatas); listView.setAdapter(commonAdapter); } private void regisetListener() { listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Bean bean = mDatas.get(position); Toast.makeText(MainActivity.this, bean.getTitle(), Toast.LENGTH_SHORT).show(); } }); } }
main.xml布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.ljh.powerfulladapter.MainActivity" > <ListView android:id="@+id/listview" android:dividerHeight="2dip" android:layout_width="match_parent" android:layout_height="match_parent" > </ListView> </RelativeLayout>
CommonAdapter 源码:
public class CommonAdapter extends CommonBaseAdapter<Bean> { public CommonAdapter(Context context,List<Bean> datas) { super(context, datas); } @Override public void convert(CommonViewHolder holder,final Bean bean) { holder.setText(R.id.title, bean.getTitle()) .setText(R.id.desc, bean.getDesc()) .setText(R.id.time, bean.getTime()) .setText(R.id.phone, bean.getPhone()); holder.setImageResource(R.id.timeMake, R.drawable.time_mark); //这个当布局里面有checkbox的时候,复用问题的解决 final CheckBox cb = holder.getView(R.id.checkbox); cb.setChecked(bean.isCheck()); cb.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { bean.setCheck(cb.isChecked()); } }); } }
listview_item.xml布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:descendantFocusability="blocksDescendants" android:layout_height="match_parent" > <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:singleLine="true" android:text="Android 新技术1" android:textColor="#000" android:textSize="18sp" /> <LinearLayout android:id="@+id/llDesc" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/title" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_marginTop="5dip" android:orientation="horizontal" > <TextView android:id="@+id/desc" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="7" android:maxLines="2" android:text="Android 新技术1" android:textSize="16sp" /> <CheckBox android:id="@+id/checkbox" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" /> </LinearLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/llDesc" > <ImageView android:id="@+id/timeMake" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="10dp" android:layout_marginTop="5dip" /> <TextView android:id="@+id/time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="10dp" android:layout_marginTop="5dip" android:layout_toRightOf="@id/timeMake" android:singleLine="true" android:text="2015-4-18" android:textSize="14sp" /> <TextView android:id="@+id/phone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="10dp" android:layout_marginTop="5dip" android:background="#00ff00" android:singleLine="true" android:text="10086" android:textSize="14sp" /> </RelativeLayout> </RelativeLayout>
这是用用的Bean实体:
public class Bean { private String title; private String desc; private String phone; private String time; //这个当布局里面有checkbox的时候,复用问题的解决 private boolean isCheck; //略去get/set等... }
以上信息参考慕课网的hyman老师的视频,在此谢谢。
相关文章推荐
- [android开发]封装BaseAdapter, 简便代码
- 适配器模式 对 BaseAdapter 抽取封装,减少代码冗余。
- BaseRecyclerViewAdapterHelper开源项目之BaseQuickAdapter源码学习上拉加载的实现代码(三)
- 我一行代码都不写实现Toolbar!你却还在封装BaseActivity?
- Android 之BaseRecyclerAdapter简单封装之路
- ListView的BaseAdapter中getView方法模板代码
- BaseRecyclerViewAdapterHelper开源项目之BaseQuickAdapter源码学习BaseViewHolder扩展功能的实现代码学习(四)
- 简单的封装BaseRecycleviewAdapter
- 我一行代码都不写实现Toolbar!你却还在封装BaseActivity?
- 一句代码实现ListView图文加载的万能适配器BaseListViewAdapter<T>
- BaseAdapter的简单封装
- 对BaseAdapter和ViewHolder的封装
- 我一行代码都不写实现Toolbar!你却还在封装BaseActivity?
- 我一行代码都不写实现Toolbar!你却还在封装BaseActivity?
- 我一行代码都不写实现Toolbar!你却还在封装BaseActivity?
- BaseAdapter自定义实现代码
- 对BaseAdapter进行封装
- 封装RecyclerView的基础适配器BaseAdapter
- Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法与有用代码片段
- 多布局BaseAdapter的封装TeachMultiTypeAdapter