listview 通用模版
阿新 • • 發佈:2018-12-06
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);