在实际的项目开发中android原生adapter并不能满足我们的需要,而且还有严重的复用问题。因此我们需要对其进行一个的封装,这样不但可以解决复用问题,同时提高代码可读性和可维护性。
1.首先创建一个adapter基类。以后所有的adapter都继承它。
/**
*
*
* @author Administrator 控制滑动过程中不加载图片
* @param <T>
*/
public abstract class BasedAdapter<T> extends BaseAdapter
{
protected List<T> mList = new LinkedList<T>();
protected Activity mActivity;
protected LayoutInflater mLayoutInflater;
protected Comparator<T> mCompatator; // 用于排序
/**
* 构造方法(默认不排序)
*/
public BasedAdapter(Activity mActivity)
{
init(mActivity, null);
}
public BasedAdapter(Activity mActivity, Comparator<T> mCompatator)
{
init(mActivity, mCompatator);
}
/**
* 初始化参数
*
* @param mAbsListView
* @param mActivity
* @param mCompatator
*/
private void init(Activity mActivity, Comparator<T> mCompatator)
{
this.mActivity = mActivity;
this.mLayoutInflater = LayoutInflater.from(mActivity);
this.mCompatator = mCompatator;
}
public List<T> getList()
{
return mList;
}
//向适配器中添加数据集合
public void setList(List<T> list)
{
if (list == null)
{
return;
}
clear();
this.mList = list;
if (mCompatator != null)
{
Collections.sort(this.mList, mCompatator);
}
notifyDataSetChanged();
}
//向适配器中追加一个对象
public void appendEntity(T entity)
{
if (entity == null)
{
return;
}
this.mList.add(entity);
if (mCompatator != null)
{
Collections.sort(this.mList, mCompatator);
}
notifyDataSetChanged();
}
<pre name="code" class="java"> //向适配器中追加数据集合
public void appendEntityList(List<T> list)
{
if (list == null)
{
return;
}
mList.addAll(list);
if (mCompatator != null)
{
Collections.sort(this.mList, mCompatator);
}
notifyDataSetChanged();
}
<pre name="code" class="java"> //向适配器中添加对象至首位
public void appendTopEntity(T entity)
{
if (entity == null)
{
return;
}
mList.add(0, entity);
if (mCompatator != null)
{
Collections.sort(this.mList, mCompatator);
}
notifyDataSetChanged();
}
//向适配器中添加数据集合至首位
public void appendTopEntityList(List<T> list)
{
if (list == null)
{
return;
}
mList.addAll(0, list);
if (mCompatator != null)
{
Collections.sort(this.mList, mCompatator);
}
notifyDataSetChanged();
}
<pre name="code" class="java"><pre name="code" class="java"> //向适配器中添加对象至指定位置
public void appendPositionEntity(T entity, int targetPosition)
{
if (entity == null)
{
return;
}
int position = targetPosition < 0 ? 0 : (targetPosition < mList.size() ? targetPosition : mList.size()); // 保持始终插入在当前List集合中
mList.add(position, entity);
if (mCompatator != null)
{
Collections.sort(this.mList, mCompatator);
}
notifyDataSetChanged();
}
<pre name="code" class="java"><pre name="code" class="java"><pre name="code" class="java"> //向适配器中添加数据集合至指定位置
public void appendPositionEntityList(List<T> list, int targetPosition)
{
if (list == null)
{
return;
}
int position = targetPosition < 0 ? 0 : (targetPosition < mList.size() ? targetPosition : mList.size()); // 保持始终插入在当前List集合中
mList.addAll(position, list);
if (mCompatator != null)
{
Collections.sort(this.mList, mCompatator);
}
notifyDataSetChanged();
}
//清空数据集
public void clear()
{
mList.clear();
notifyDataSetChanged();
}
// --------------------------BaseAdapte必须实现的方法------------------------------------
@Override
public int getCount()
{
return mList.size();
}
@Override
public Object getItem(int position)
{
return mList.get(position);
}
@Override
public long getItemId(int position)
{
return position;
}
} 2.创建具体的实例适配器,继承basedAdapter
public class MyAdapter extends BasedAdapter<NotificationDTO> (此处传入集合中的对象)
{
public MyAdapter (Activity mActivity)
{
super(mActivity);
// TODO Auto-generated constructor stub
}
@Override
public View getView(int position, View convertView, ViewGroup arg2)
{
HoldView mHoldView;
if (convertView == null)
{
convertView = mLayoutInflater.inflate(R.layout.item, null);
mHoldView = new HoldView(convertView);
convertView.setTag(mHoldView);
}
else
{
mHoldView = (HoldView)convertView.getTag();
}
mHoldView.update(getList(), position);
//item中控件的点击事件
<pre name="code" class="java"> mHoldView.addListener(getList(), position);
return convertView; } class HoldView { private ImageView imageView; private TextView textView; public HoldView(View convertView) { imageView= (ImageView)convertView.findViewById(R.id.imageView);
textView= (TextView)convertView.findViewById(R.id.textView); } //此处记载对象中数据 @SuppressLint("ResourceAsColor") void update(List<MyDTO> MyDTOs, int position) { MyDTO = MyDTOs.get(position);
textView.setTextView("");
ImageView.setImageBitmap(""""");
}
//此处对item中的控件添加监听
void addListener(List<MyDTO> MyDTOs, int position)
{
ImageView.setOnClickListener(new OnClickListener(){
@over...
onClick(View view){
}
});
}
} } 这样就基本满足项目的需要了,在请求数据列表之后我们可以:
MyAdapter myAdapter=new MyAdapter(this);
myAdapter.setList("将获得数据集放入适配器中");
获得适配器中的数据集:
myAdapter.getList();
其他的一些方法我就不再赘述了。我封装的都比较基础,希望大家能提出一些宝贵的意见。