最近用到了一种Adapter的新写法,分享一下顺便加深自己的印象.
直接上代码。
User:
public class User {
private int id;
private String name;
private String num;
public User(int id, String name, String num) {
super();
this.id = id;
this.name = name;
this.num = num;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "the user id is "+ getId()+" the name is "+ getName()+" the num is "+ getNum();
}
}
ViewHolderBase:
public abstract class ViewHolderBase<ItemDataType> {
protected int mLastPosition;
protected int mPosition = -1;
public abstract View createView(LayoutInflater layoutInflater);
public abstract void showData(int position, ItemDataType itemData);
public void setItemData(int position) {
mLastPosition = position;
mPosition = position;
}
public boolean stillHoldLastItemData() {
return mLastPosition == mPosition;
}
}
ViewHolderCreator
public interface ViewHolderCreator<ItemDataType> {
public ViewHolderBase<ItemDataType> createViewHolder();
}
ListViewDataAdapterBase:
public abstract class ListViewDataAdapterBase<ItemDataType> extends BaseAdapter {
protected ViewHolderCreator<ItemDataType> mViewHolderCreator;
private LayoutInflater mLayoutInflater = null;
public ListViewDataAdapterBase(
ViewHolderCreator<ItemDataType> mViewHolderCreator,
Context context) {
this.mViewHolderCreator = mViewHolderCreator;
mLayoutInflater = LayoutInflater.from(context);
}
@Override
public abstract ItemDataType getItem(int position);
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ItemDataType itemData = getItem(position);
if (convertView == null) {
ViewHolderBase<ItemDataType> holderbase = mViewHolderCreator
.createViewHolder();
if (holderbase != null) {
convertView = holderbase.createView(mLayoutInflater);
if (convertView != null) {
holderbase.setItemData(position);
holderbase.showData(position, itemData);
convertView.setTag(holderbase);
}
}
} else {
@SuppressWarnings("unchecked")
ViewHolderBase<ItemDataType> holderBase = (ViewHolderBase<ItemDataType>) convertView
.getTag();
if (holderBase != null) {
holderBase.setItemData(position);
holderBase.showData(position, itemData);
}
}
return convertView;
}
}
ListViewDataAdapter:
public class ListViewDataAdapter<ItemDataType> extends
ListViewDataAdapterBase<ItemDataType> {
protected ArrayList<ItemDataType> mItemDataList = new ArrayList<ItemDataType>();
public ListViewDataAdapter(
ViewHolderCreator<ItemDataType> mViewHolderCreator,
Context context) {
super(mViewHolderCreator, context);
// TODO Auto-generated constructor stub
}
public ArrayList<ItemDataType> getDataList() {
return mItemDataList;
}
@Override
public int getCount() {
return mItemDataList.size();
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public ItemDataType getItem(int position) {
if (mItemDataList.size() < position || position < 0) {
return null;
}
return mItemDataList.get(position);
}
}
MainActivity:
public class MainActivity extends Activity {
private ListView mListView;
private ListViewDataAdapter<User> mAdapter = null;
private List<User> mList = new ArrayList<User>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
for (int i = 0; i < 100; i++) {
mList.add(new User(i, "Klaus", "44872978u"));
}
mListView = (ListView) findViewById(R.id.myListView);
mAdapter = new ListViewDataAdapter<User>(new ViewHolderCreator<User>() {
@Override
public ViewHolderBase<User> createViewHolder() {
return new ViewHolderBase<User>() {
View convertView;
TextView id;
TextView name;
TextView num;
@SuppressLint("InflateParams")
@Override
public View createView(LayoutInflater layoutInflater) {
Log.d("Klaus", "the view is create createView");
convertView = layoutInflater.inflate(
R.layout.layoutitem, null);
Log.d("Klaus",
"the convertView is " + convertView.toString());
id = (TextView) convertView.findViewById(R.id.id);
name = (TextView) convertView.findViewById(R.id.name);
num = (TextView) convertView.findViewById(R.id.num);
return convertView;
}
@Override
public void showData(final int position, User itemData) {
Log.d("Klaus", "the data is show showData");
Log.d("Klaus", "the id is " + id.getId());
Log.d("Klaus",
"the itemDatais " + itemData.toString());
id.setText(itemData.getId() + "");
name.setText(itemData.getName());
num.setText(itemData.getNum());
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.d("Klaus", "the position is " + position);
}
});
}
};
}
}, this);
mListView.setAdapter(mAdapter);
mAdapter.getDataList().addAll(mList);
mAdapter.notifyDataSetChanged();
}
activity_main:
<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.example.testlistview.MainActivity" >
<ListView
android:id="@+id/myListView"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
layoutItem:
<?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="horizontal" >
<TextView
android:id="@+id/id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"/>
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"/>
<TextView
android:id="@+id/num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"/>
</LinearLayout>