ViewHolder类
public class CommonViewHolder {
private final SparseArray<View> mViews;
private final int mLayoutId;
private int mPosition;
private final View mConvertView;
public int getLayoutId() {
return mLayoutId;
}
private CommonViewHolder(ViewGroup parent, int layoutId, int position) {
this.mPosition = position;
this.mViews = new SparseArray<>();
this.mLayoutId = layoutId;
// TODO
mConvertView = LayoutInflater.from(parent.getContext()).inflate(layoutId, null);
mConvertView.setTag(this);
}
public static CommonViewHolder get(View convertView,
ViewGroup parent, int layoutId, int position) {
CommonViewHolder holder;
if (convertView == null || ((CommonViewHolder) convertView.getTag()).getLayoutId() != layoutId) {
holder = new CommonViewHolder(parent, layoutId, position);
} else {
holder = (CommonViewHolder) convertView.getTag();
holder.mPosition = position;
}
return holder;
}
public View getConvertView() {
return mConvertView;
}
@SuppressWarnings("unchecked")
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 CommonViewHolder setText(int viewId, String text) {
TextView view = getView(viewId);
view.setText(text);
return this;
}
public CommonViewHolder setImageResource(int viewId, int drawableId) {
ImageView view = getView(viewId);
if (view != null) {
view.setImageResource(drawableId);
}
return this;
}
public CommonViewHolder setImageBitmap(int viewId, Bitmap bm) {
ImageView view = getView(viewId);
view.setImageBitmap(bm);
return this;
}
public int getPosition() {
return mPosition;
}
}
adapter类
public abstract class CommonAdapter<T> extends BaseAdapter {
protected LayoutInflater mInflater;
protected Context mContext;
protected List<T> mDatas = new ArrayList<>();
protected final int mItemLayoutId;
public CommonAdapter(Context context, T[] datas, int itemLayoutId) {
mContext = context;
mInflater = LayoutInflater.from(mContext);
mItemLayoutId = itemLayoutId;
ArrayList<T> dataList = new ArrayList<>();
if (datas != null) {
Collections.addAll(dataList, datas);
}
mDatas.addAll(dataList);
}
public CommonAdapter(Context context, List<T> datas, int itemLayoutId) {
mContext = context;
mInflater = LayoutInflater.from(mContext);
mDatas.addAll(datas);
mItemLayoutId = itemLayoutId;
}
public void updateData(List<T> datas) {
mDatas.clear();
mDatas.addAll(datas);
notifyDataSetChanged();
}
public void updateData(T[] datas) {
mDatas.clear();
if (datas != null && datas.length != 0) {
Collections.addAll(mDatas, datas);
}
notifyDataSetChanged();
}
@Override
public int getCount() {
return mDatas == null ? 0 : mDatas.size();
}
@Override
public T getItem(int position) {
return mDatas == null ? null : mDatas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final CommonViewHolder viewHolder = getViewHolder(position, convertView, parent);
convert(viewHolder, getItem(position));
View view = viewHolder.getConvertView();
if (parent instanceof ListView && !useCustomListSelector()) {
view.setBackgroundResource(R.drawable.clickable_item_bg_selector);
}
return view;
}
public abstract void convert(CommonViewHolder helper, T item);
public boolean useCustomListSelector() {
return false;
}
public List<T> datas() {
return mDatas;
}
private CommonViewHolder getViewHolder(int position, View convertView, ViewGroup parent) {
return CommonViewHolder.get(convertView, parent, mItemLayoutId, position);
}
private OnItemClickListener<T> mItemClickListener;
public void setOnItemClickListener(OnItemClickListener<T> listener) {
mItemClickListener = listener;
}
public interface OnItemClickListener<T> {
void onItemClick(int position, T data, View itemView);
}
}
资源文件
在drawable目录中添加文件clickable_item_bg_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (c) 2018. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
~ Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
~ Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
~ Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
~ Vestibulum commodo. Ut rhoncus gravida arcu.
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:state_pressed="false">
<color android:color="@android:color/white"/>
</item>
<item android:state_enabled="true" android:state_pressed="false">
<color android:color="@android:color/white"/>
</item>
<item android:state_enabled="true" android:state_pressed="true">
<color android:color="#D9D9D9"/>
</item>
</selector>
在res目录下创建目录drawable-v21 ,添加文件 clickable_item_bg_selector.xml
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#D9D9D9">
<item>
<shape android:shape="rectangle">
<solid android:color="@android:color/white" />
</shape>
</item>
</ripple>
在styles.xml文件中添加以下样式,主要是去掉默认的分割线
<style name="defaultListView">
<item name="android:listSelector">@android:color/transparent</item>
<item name="android:divider">@null</item>
</style>
使用listview模版
第一步,布局文件添加listview控件
<ListView
android:id="@+id/research_listview"
style="@style/defaultListView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
第二步,创建数据bean,例如Bean
第三步,新建一个weiget的类,集中处理item的ui,例如ListItem,继承自通用的布局,例如RelativeLayout
import android.content.Context;
import android.util.AttributeSet;
import android.widget.RelativeLayout;
import okhttp.example.com.okhttptest.activity.bean.Bean;
public class ListItem extends RelativeLayout {
public ListItem(Context context) {
super(context);
}
public ListItem(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ListItem(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setup(Bean bean){
//TODO 初始化界面
}
}
第四步,创建item的布局文件,例如R.layout.item,并且根布局指向之前新建的weiget类
<xxx.ListItem
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/image"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_centerVertical="true"/>
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/image"/>
</xxx.ListItem >
第五步
在activity中实例化listview,
private ListView mListView;
private MyAdapter mAdapter;
private List<Bean> mList = new ArrayList<>();
@Override
public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
super.onCreate(savedInstanceState, persistentState);
setContentView(R.layout.activity_main);
mListView = findViewById(R.id.listview);
//期间可以先设置header,根据需要来弄
mAdapter = new MyAdapter(this,mList,R.layout.item);
mListView.setAdapter(mAdapter);
}
private class MyAdapter extends CommonAdapter<Bean>{
public MyAdapter(Context context, List<Bean> datas, int itemLayoutId) {
super(context, datas, itemLayoutId);
}
@Override
public void convert(CommonViewHolder helper, Bean item) {
ListItem widgetView = (ListItem) helper.getConvertView();
widgetView.setup(item);
}
}
更新数据
mAdapter.updateData(mList);