快速开发Adapter

来源:互联网 发布:盘古数据科技有限公司 编辑:程序博客网 时间:2024/06/03 21:16

1、首先将getView以外的方法重写,简化重复步骤:

import java.util.List;import android.content.Context;import android.view.LayoutInflater;import android.widget.BaseAdapter;public abstract class DefaultAdapter<T> extends BaseAdapter {private final List<T> mList;private Context mContext;private LayoutInflater inflater;public DefaultAdapter(Context context, List<T> list) {mContext = context;mList = list;inflater = LayoutInflater.from(mContext);}public Context getContext() {return mContext;}public LayoutInflater getInflater() {return inflater;}public List<T> getList() {return mList;}@Overridepublic int getCount() {return mList.size();}@Overridepublic Object getItem(int position) {return mList.get(position);}@Overridepublic long getItemId(int position) {return position;}}

这样自己的adapter只要重写getView方法就可以。

2、一般情况下adapter都只有一个布局文件,不会重写getViewTypeCount方法,这是可以进一步简化:

import java.util.List;import android.content.Context;import android.view.View;import android.view.ViewGroup;public abstract class DefaultSingleAdapter<T> extends DefaultAdapter<T> {private int mResourceId;public abstract Object onCreateViewHolder(View convertView);public abstract void onBindViewHolder(Object viewHolder, int position);public DefaultSingleAdapter(Context context, int resourceId, List<T> list) {super(context, list);mResourceId = resourceId;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {Object viewHolder = null;if(convertView == null) {convertView = getInflater().inflate(mResourceId, parent, false);viewHolder = onCreateViewHolder(convertView);convertView.setTag(viewHolder);} else {viewHolder = convertView.getTag();}onBindViewHolder(viewHolder, position);return convertView;}}
这样自己的adapter只要重写两个方法就可以,如下:

public class CityAdapter extends DefaultSingleAdapter<City> {public CityAdapter(Context context, List<City> list) {super(context, R.layout.layout_city_item, list);}private static final class ViewHolder {TextView tv_id;TextView tv_name;public ViewHolder(View view) {tv_id = (TextView) view.findViewById(R.id.tv_id);tv_name = (TextView) view.findViewById(R.id.tv_name);}}@Overridepublic Object onCreateViewHolder(View convertView) {return new ViewHolder(convertView);}@Overridepublic void onBindViewHolder(Object viewHolder, int position) {ViewHolder holder = (ViewHolder) viewHolder;City city = (City) getItem(position);holder.tv_id.setText(String.valueOf(city.getId()));holder.tv_name.setText(city.getName());}}
和以前相比简化了大部分的重复代码,哈哈!

========2015-3-9==========

其实viewholder也可以用泛型来代替的,这样回调中就不用强转了:

public abstract class DefaultSingleAdapter<T, K> extends DefaultAdapter<T> {private int mResourceId;public abstract K onCreateViewHolder(View convertView);public abstract void onBindViewHolder(K viewHolder, int position);public DefaultSingleAdapter(Context context, int resourceId, List<T> list) {super(context, list);mResourceId = resourceId;}@SuppressWarnings("unchecked")@Overridepublic View getView(int position, View convertView, ViewGroup parent) {K viewHolder = null;if(convertView == null) {convertView = getInflater().inflate(mResourceId, parent, false);viewHolder = onCreateViewHolder(convertView);convertView.setTag(viewHolder);} else {viewHolder = (K) convertView.getTag();}onBindViewHolder(viewHolder, position);return convertView;}}


0 0
原创粉丝点击