超简便的ListView中Adapter的写法

对于 ListView 的使用,他有两个重点的部分,一个是下拉刷新和加载更多,这个今天我们不讲,另外一个是 BaseAdapter 的使用,这个是今天的主角,BaseAdapter 中又有 ViewHolder 模式来实现缓存视图

继承BaseAdapter类,实现以下几个方法

getCount() ->int 返回的是 List的个数

getView(int, View, ViewGroup)->View 返回显示的视图

getItemId(int position) ->long返回position位置的 id

getItem(int position)->Object 返回position位置的 item

现在我们在这个基础上,继承 BaseAdapter 实现几个方法.

MBaseAdapter.class

public abstract class MBaseAdapter  extends BaseAdapter {

public LayoutInflater inflater;

public Context context;

public List<?> list;

public MBaseAdapter(Context context, List<?> list) {

this.context = context;

this.list = list;

this.inflater = LayoutInflater.from(context);

}

public MBaseAdapter(LayoutInflater inflater, List<?> list) {

this.context = inflater.getContext();

this.list = list;

this.inflater = inflater;

}

@Override

public int getCount() {

return list.size();

}

@Override

public Object getItem(int position) {

return list.get(position);

}

@Override

public long getItemId(int position) {

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

return getView33(position, convertView, parent);

}

/**

* 与BaseAdapter 中的getView() 一样

*

* @param position

* @param convertView

* @param parent

* @return

*/

public abstract View getView33(int position, View convertView,

ViewGroup parent);

}

为了实现 ViewHodler 缓存我写了这个工具类

ViewHolderUtils.class

public class ViewHolderUtils {

/**

* 得到视图为 view 的 viewHodler

* @param view

* @return

*/

public ViewHolder get(View view) {

ViewHolder viewHolder = (ViewHolder) view.getTag();

if (viewHolder == null) {

viewHolder = new ViewHolder(view);

view.setTag(viewHolder);

}

return viewHolder;

}

/**

* viewhodler  存储 view的子 view 的索引

* @author zzz40500

*

*/

public class ViewHolder {

private SparseArray<View> viewHolder;

private View view;

public ViewHolder(View view) {

this.view = view;

viewHolder = new SparseArray<View>();

}

public <T extends View> T get(int id) {

View childView = viewHolder.get(id);

if (childView == null) {

childView = view.findViewById(id);

viewHolder.put(id, childView);

}

return (T) childView;

}

/**

* 得到 view 下 id 为 id 的TextView 这里没有做类型的判断所以你要保证 id 为 id 的控件确实为 TextView类型

* @param id

* @return

*/

public TextView getTextView(int id) {

return get(id);

}

/**

* 直接设置文字

* @param id

* @param text

*/

public void setText(int id,String text){

getTextView(id).setText(text);

}

public ImageView getImageView(int id) {

return get(id);

}

}

}

现在结合上面两个类,我们可是实现了更简单的 adapter 写法

AutoAdapter.class

public abstract class AutoAdapter extends MBaseAdapter{

/**

* item 的布局文件

*/

private int layoutID;

/**

* 这是一个生产 ViewHolder的工具类

*/

private ViewHolderUtils vh;

public AutoAdapter(Context context, List<?> list, int layoutID) {

super(context, list);

this.layoutID = layoutID;

vh = new ViewHolderUtils();

}

@Override

public View getView33(int position, View convertView, ViewGroup parent) {

if (convertView == null) {

convertView = inflater.inflate(layoutID, parent, false);

}

getView33(position, convertView, vh.get(convertView));

return convertView;

}

/**

* 通过暴露这个方法,通过操作vh实现将数据的绑定在视图上

* @param position

* @param v

* @param vh

*/

public abstract void getView33(int position, View v, ViewHolderUtils.ViewHolder vh);

}

重点来了:

我们现在有一个适配器要写,怎么写呢,只要继承AutoAdapter,

我们只要实现了两个方法:getView33和它自身的构造方法,他就可以快速实现了适配器的编写,并且这个适配器是 Viewhodler 的形式.

例子:

public class DemoAdapter extends AutoAdapter {

public DemoAdapter(Context context, List<?> list) {

/**

* 这里的 LayoutID 确定 ListView item 的布局资源文件.

*/

super(context, list, R.layout.item);

}

/**

* 将数据绑定在视图上

*/

@Override

public void getView33(int position, View v, ViewHolder vh) {

Entity item=(Entity) list.get(position);

vh.getTextView(R.id.name).setText(item.getName());

vh.getTextView(R.id.age).setText(item.getAge());

vh.setText(R.id.height,item.getHeight());

}

}

在 Activity 中的使用:

BaseAdapter adapter=new DemoAdapter(this, dateA);

listView.setAdapter(adapter);

来自为知笔记(Wiz)

时间: 2024-08-02 10:57:37

超简便的ListView中Adapter的写法的相关文章

listView中adapter有不同的click事件的简单写法

在android中,listview一般都是通过一个adapter来绑定数据,一般的item的点击事件都会指向同一个目标(intent),只是所带的参数不同而已,但有的时候事与愿违,每个item的目标(intent)是不同的,此时我们需要一点技巧来处理这种情况...我的做法是每个item对应的entity添加一个listener ,来监听自己的事件..上代码: Listitem的定义[包含了一个onClickListener] public static class ListItem{ publ

android 修改listview中adapter数据时抛出异常java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification问题

近日在做项目时遇到非必现crush,具体异常信息为: // Short Msg: java.lang.IllegalStateException // Long Msg: java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not mo

Android开发之ListView中Adapter的优化

ListView是Android开发最常用的控件,适配器adapter是将要显示的数据映射到View中并添加到ListView中显示 在实现ListView时,我们需要定义适配器如BaseAdapter.ArrayAdapter.CursorAdapter.SimpleAdapter等,并且重写其一下四个方法: 1 public int getCount(): 2 public Object getItem(int position) 3  public long getItemId(int p

Android开发系列(十四):ListView用法、对ListView监听的三种方法以及ListView中Adapter的使用方法

一.ArrayAdapter的介绍以及ListView的用法: Adapter是数据和视图之间的桥梁,数据在adapter中做处理,然后显示到视图上面.就是用来绑定数据用的. 用一个小例子来介绍一下: public class FriendActivity extends Activity { private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCrea

Android开发之关于ListView中adapter调用notifyDataSetChanged无效的原因

1.数据源没有更新,调用notifyDataSetChanged无效. 2.数据源更新了,但是它指向新的引用,调用notifyDataSetChanged无效. 3.数据源更新了,但是adpter没有收到消息通知,无法动态更新列表. 我遇到的问题是:数据源更新了,但是adapter中的数据源没有更新,所以造成调用notifyDataSetChanged无效

android 自定义adapter和线程结合 + ListView中按钮滑动后状态丢失解决办法

adapter+线程 1.很多时候自定义adapter的数据都是来源于服务器的,所以在获取服务器的时候就需要异步获取,这里就需要开线程了(线程池)去获取服务器的数据了.但这样有的时候adapter的中没有数据. 如下面的代码: 这就是在initData中异步获取服务器的数据,然后实例化adatper,再将adapter赋给listView. 2.initData()中的代码是: 这里线程要睡眠5秒钟,是为了模仿网络的耗时操作 3.Handler: 在Handler中接收到数据后给list赋值后,

ListView中使用自定义Adapter及时更xin

在项目中,遇到不能ListView及时更新的问题.写了一个demo,其中也遇到一些问题,一并写出来.好吧,上代码: public class PersonAdapter extends BaseAdapter { private ArrayList<PersonBean> mList; private Context mContext; public PersonAdapter(ArrayList<PersonBean> list, Context context) { mList

listview中的adapter学习小结

概述 Adapter是数据和UI之间的一个桥梁,在listview,gridview等控件中都会使用到,android给我们提拱了4个adapte供我们使用: BaseAdapter是一个抽象类,继承它需要实现较多的方法 ArrayAdapter支持泛型操作,最为简单,只能展示一行字 SimpleAdapter有最好的扩充性,可以自定义出各种效果 SimpleCursorAdapter可以适用于简单的纯文字型ListView,它需要Cursor的字段和UI的id对应起来.如需要实现更复杂的UI也

ListView的adapter中getView方法一直调用

当ListView的高度不定(例如重写ListView搞成可自动的扩展的ListView)或 ListView嵌套在SrollView(高度不定)中,listView中的一个item元素改变会使得全部item都调用getView()的方法. 这种 ok 一定要用LinearLayout套ListView(具体原因还不太清楚) <ScrollView android:layout_width="match_parent" android:layout_height="40