零、前言
[1].第一次自己ListView封装时,封装的比较差,用起来不是很好用,虽然比起原生好很多
[2].第二次接触ListView封装是在慕课网hyman的课程,深深折服
[3].基于此思想,自己封装了RecyclerView
一、使用
1.使用起来只要两步
public class Up3Activity extends AppCompatActivity {
@BindView(R.id.lv)
ListView mLv;
private ArrayList<String> mNames;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
mNames = DataUtils.getRandomName(200000, true);
mLv.setAdapter(new MyLVAdapter<String>(this, mNames, R.layout.item_array_with_img) {
@Override
public void setData(MyLVHolder holder, String data, int position) {
holder.setText(R.id.tv_content, data);
}
});
}
}
二、封装过程:
1. MyLVHolder类
/**
* 作者:张风捷特烈
* 时间:2018/4/6:11:30
* 邮箱:1981462002@qq.com
* 说明:MyLVHolder
*/
public class MyLVHolder {
/**
* 条目内部控件的view集合
*/
private SparseArray<View> mViews;
/**
* 位置
*/
private int mPosition;
/**
* 条目视图
*/
private View mItemView;
private List<Integer> mPos;
/**
* @param ctx 上下文
* @param parent parent
* @param layoutId 布局ID
* @param position 位置
*/
public MyLVHolder(Context ctx, ViewGroup parent, int layoutId, int position) {
mPosition = position;
mViews = new SparseArray<>();
//生成条目的View
mItemView = LayoutInflater.from(ctx).inflate(layoutId, parent, false);
//用MyLVHolder为条目View设置标签
mItemView.setTag(this);
}
/**
* 获取 MyLVHolder 对象
*
* @param ctx 上下文
* @param convertView convertView
* @param parent parent
* @param layoutId 布局ID
* @param position 位置
* @return MyLVHolder 对象
*/
public static MyLVHolder get(Context ctx, View convertView, ViewGroup parent, int layoutId, int position) {
//convertView为空
if (convertView == null) {
//创建MyLVHolder对象
return new MyLVHolder(ctx, parent, layoutId, position);
} else {
//复用MyLVHolder
MyLVHolder holder = (MyLVHolder) convertView.getTag();
holder.mPosition = position;//更新position
return holder;
}
}
public List<Integer> handleCheckBox(int checkBoxId) {
mPos = new ArrayList<>();
final CheckBox cb = this.getView(checkBoxId);
cb.setChecked(false);
if (mPos.contains(this.getPosition())) {
cb.setChecked(true);
}
cb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (cb.isChecked()) {
mPos.add(getPosition());
} else {
mPos.remove((Integer) getPosition());
}
}
});
return mPos;//返回选中的CheckBox位置集合
}
public View getItemView() {
return mItemView;
}
/**
* 通过viewId获取控件
*
* @param viewId 条目内部控件的id
* @param <T> 数据泛型
* @return view
*/
public <T extends View> T getView(int viewId) {
//通过viewId为键获取View值
View view = mViews.get(viewId);
//如果view为空
if (view == null) {
//条目findViewById获取View
view = mItemView.findViewById(viewId);
//以id为键,View为值存入mViews集合
mViews.put(viewId, view);
}
return (T) view;
}
public View getConvertView() {
return mItemView;
}
public int getPosition() {
return mPosition;
}
/**
* 设置TextView文本方法
*
* @param viewId 条目内部控件的id
* @param text 文本
* @return MyLVHolder对象
*/
public MyLVHolder setText(int viewId, String text) {
TextView view = getView(viewId);
view.setText(text);
return this;
}
/**
* 通过id设置图片
* @param viewId 条目内部控件的id
* @param resId 资源id
* @return MyLVHolder对象
*/
public MyLVHolder setImageViewRes(int viewId, int resId) {
ImageView view = getView(viewId);
view.setImageResource(resId);
return this;
}
/**
* 通过id设置图片
* @param viewId 条目内部控件的id
* @param bitmap 图片
* @return MyLVHolder对象
*/
public MyLVHolder setImageViewBitmap(int viewId, Bitmap bitmap) {
ImageView view = getView(viewId);
view.setImageBitmap(bitmap);
return this;
}
}
2.适配器类:MyLVAdapter
/**
* 作者:张风捷特烈
* 时间:2018/4/6:13:51
* 邮箱:1981462002@qq.com
* 说明:ListView适配器
*/
public abstract class MyLVAdapter<T> extends BaseAdapter {
/**
* 数据
*/
protected List<T> mDatas;
/**
* 布局ID
*/
protected int mLayoutId;
/**
* 上下文
*/
protected Context mCtx;
public MyLVAdapter(Context ctx, List<T> datas, int listId) {
mCtx = ctx;
mDatas = datas;
mLayoutId = listId;
}
@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) {
//创建 MyLVHolder 对象
MyLVHolder holder = MyLVHolder.get(mCtx, convertView, parent, mLayoutId, position);
setData(holder, getItem(position), position);
return holder.getConvertView();
}
/**
* 设置数据抽象方法
* @param holder MyLVHolder
* @param data 数据
* @param position 位置
*/
public abstract void setData(MyLVHolder holder, T data, int position);
}
附录、布局:
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"
android:orientation="vertical">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fastScrollEnabled="true">
</ListView>
</LinearLayout>
layout/item_array_with_img.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp">
<ImageView
android:id="@+id/iv_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"/>
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:textSize="18sp"
android:textColor="#000"
android:layout_toRightOf="@+id/iv_icon"
android:text=""/>
</RelativeLayout>
后记、
1.声明:
[1]本文由张风捷特烈原创,转载请注明
[2]欢迎广大编程爱好者共同交流
[3]个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
[4]你的喜欢与支持将是我最大的动力
2.连接传送门:
更多安卓技术欢迎访问:安卓技术栈
我的github地址:欢迎star
简书首发,腾讯云+社区同步更新
张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com
3.联系我
QQ:1981462002
邮箱:1981462002@qq.com
微信:zdl1994328