CommonAdapter:
/*
* @Copyright (c) tianchenglin
* @Author TCL
* @Date 2016.7.5
*/
package com.study.tcl.commonadapter;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import java.util.List;
/**
* Created by TCL on 2016/7/5.
*/
public abstract class CommonAdapter<T> extends BaseAdapter {
private Context mContext;
private List<T> mData;
private int mItemLayoutId;//每一行item布局文件
public CommonAdapter(Context context, List<T> data, int itemLayoutId) {
this.mContext = context;
this.mData = data;
this.mItemLayoutId = itemLayoutId;
}
@Override
public int getCount() {
return mData.size();
}
@Override
public T getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = ViewHolder.getInstance(mContext, convertView, parent, mItemLayoutId, position);
//填充数据
convert(viewHolder, getItem(position));
return viewHolder.getConvertView();
}
public abstract void convert(ViewHolder viewHolder, T item);
}
ViewHolder:
/*
* @Copyright (c) tianchenglin
* @Author TCL
* @Date 2016.7.5
*/
package com.study.tcl.commonadapter;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
/**
* Created by TCL on 2016/7/5.
*/
public class ViewHolder {
private SparseArray<View> mViews;//稀疏数组,里面放的是一行里面所有的控件
private int mPosition;
private View mConvertView;//每一行对应的布局
//采用单例模式
private ViewHolder(Context context, ViewGroup parent, int layoutId, int position) {
this.mPosition = position;
this.mViews = new SparseArray<View>();
/**此处用LayoutInflater,直接使用View.inflate报错**/
this.mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false);
this.mConvertView.setTag(this);
}
/**
* 获取ViewHolder对象
*
* @return
*/
public static ViewHolder getInstance(Context context, View convertView, ViewGroup parent, int layoutId, int
position) {
if (convertView == null) {
synchronized (ViewHolder.class) {
return new ViewHolder(context, parent, layoutId, position);
}
} else {
return (ViewHolder) convertView.getTag();
}
}
/**
* 通过控件的id得到相应的控件(因为不知道控件的类型,要用到泛型)
*/
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;
}
/**
* 为TextView赋值
*/
public ViewHolder setText(int viewId, String text) {
TextView view = getView(viewId);//找到控件
view.setText(text);
return this;
}
/**
* 为ImageView设置图片
*/
public ViewHolder setImageBitmap(int viewId, Bitmap bitmap) {
ImageView view = getView(viewId);
view.setImageBitmap(bitmap);
return this;
}
/**
* 返回行号
*
* @return
*/
public int getPosition() {
return mPosition;
}
/**
* 返回行view
*
* @return
*/
public View getConvertView() {
return mConvertView;
}
}
MainActivity:
/*
* @Copyright (c) tianchenglin
* @Author TCL
* @Date 2016.7.5
*/
package com.study.tcl.commonadapter;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ListView lv_list;
//准备数据
private List<String> mData = new ArrayList<String>(Arrays.asList("宋江", "卢俊义", "吴用",
"公孙胜", "关胜", "林冲", "秦明", "呼延灼", "花荣", "柴进", "李应", "朱仝", "鲁智深",
"武松", "董平", "张清", "杨志", "徐宁", "索超", "戴宗", "刘唐", "李逵", "史进", "穆弘",
"雷横", "李俊", "阮小二", "张横", "阮小五", " 张顺", "阮小七", "杨雄", "石秀", "解珍",
" 解宝", "燕青", "朱武", "黄信", "孙立", "宣赞", "郝思文", "韩滔", "彭玘", "单廷珪",
"魏定国", "萧让", "裴宣", "欧鹏", "邓飞", " 燕顺", "杨林", "凌振", "蒋敬", "吕方",
"郭 盛", "安道全", "皇甫端", "王英", "扈三娘", "鲍旭", "樊瑞", "孔明", "孔亮", "项充",
"李衮", "金大坚", "马麟", "童威", "童猛", "孟康", "侯健", "陈达", "杨春", "郑天寿",
"陶宗旺", "宋清", "乐和", "龚旺", "丁得孙", "穆春", "曹正", "宋万", "杜迁", "薛永", "施恩"));
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
this.lv_list = (ListView) findViewById(R.id.lvList);
//设置适配器
lv_list.setAdapter(new CommonAdapter<String>(getApplicationContext(), mData, R.layout.item) {
@Override
public void convert(ViewHolder viewHolder, String item) {
viewHolder.setText(R.id.tvName, item);
}
});
}
}
activity_main:
<?xml version="1.0" encoding="utf-8"?>
<!--
~ @Copyright (c) tianchenglin
~ @Author TCL
~ @Date 2016.7.5
-->
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.study.tcl.commonadapter.MainActivity">
<ListView
android:id="@+id/lvList"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</RelativeLayout>
item:
<?xml version="1.0" encoding="utf-8"?>
<!--
~ @Copyright (c) tianchenglin
~ @Author TCL
~ @Date 2016.7.5
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tvName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#000000"
android:textSize="18sp"/>
</LinearLayout>