android 手把手教你打造万能的ListView GridView的适配器

我们在开发项目中,listview是最常用的控件,也算是android中控件这块属于比较难点的,或容易出现问题的地方,说他难不是说简单的使用,那个相信大家会,比如结合网络访问,异步记载图片,滑动卡以及嵌套等,今天是写一篇关于ListView,GridView通用的adapter,而在adapter中getCount,getItem,getItemId,getView要复写这4个方法,下面看下我们adapter类常写的方式

布局文件

<RelativeLayout xmlns:android="" xmlns:tools="" android:layout_width="match_parent" android:layout_height="match_parent" > <ListView android:id="@+id/lv" android:layout_width="fill_parent" android:layout_height="fill_parent" /></RelativeLayout>

item布局

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" ><TextView android:id="@+id/tvContent" android:layout_width="fill_parent" android:layout_height="40dp" /></LinearLayout>

MainActivity,class

public class MainActivity extends Activity {private ListView lv;private List<String> datas;private LayoutInflater inflater;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);lv = (ListView) findViewById(R.id.lv);inflater = LayoutInflater.from(this);datas = new ArrayList<String>();datas.add("hello world");datas.add("hello world");datas.add("hello world");datas.add("hello world");datas.add("hello world");datas.add("hello world");datas.add("hello world");datas.add("hello world");datas.add("hello world");datas.add("hello world");datas.add("hello world");datas.add("hello world");datas.add("hello world");datas.add("hello world");MyAdapter adapter = new MyAdapter();lv.setAdapter(adapter);}class MyAdapter extends BaseAdapter {@Overridepublic int getCount() {return datas.size();}@Overridepublic Object getItem(int position) {return datas.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if(convertView==null){holder = new ViewHolder();convertView = inflater.inflate(R.layout.item, null);holder.tvContent = (TextView) convertView.findViewById(R.id.tvContent);convertView.setTag(holder);}else{holder = (ViewHolder) convertView.getTag();}holder.tvContent.setText(datas.get(position));return convertView;}}static class ViewHolder{TextView tvContent;}}

在adapter中我们发现其实adapter真正每次实现不一样的是getView()方法,我们要对其优化封装,现在想办法封装一个通用的adapter,如何抽取呢?其实无非是java面向对象的几个基本特征:抽象,封装,继承,多态,当我们看见一段代码在每个类中都会出现,那么我们就最好把这些相同的代码封装到一个父类中,而每个类针对不同的业务方法不一样,就让其子类去实现,那么这个时候我们想到了java中的抽象类了,现在就对adapter方法进行简单的封装下:

MyBaseAdapter.java

public abstract class MyBaseAdapter<T> extends BaseAdapter {private List<T> datas;private Context context;public MyBaseAdapter(List<T> datas, Context context) {super();this.datas = datas;this.context = context;}@Overridepublic int getCount() {return datas.size();}@Overridepublic Object getItem(int position) {return datas.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic abstract View getView(int position, View convertView, ViewGroup parent);}

我们发现以后只要继承此MyBaseAdapter就可以少写getCount,getItem,getItemId。只要复写getView()方法即可,这比之前优化进了一下步,现在我们看看getView()方法代码怎么写的

@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if(convertView==null){holder = new ViewHolder();convertView = inflater.inflate(R.layout.item, null);holder.tvContent = (TextView) convertView.findViewById(R.id.tvContent);convertView.setTag(holder);}else{holder = (ViewHolder) convertView.getTag();}holder.tvContent.setText(datas.get(position));return convertView;}}static class ViewHolder{TextView tvContent;}

失败是什么?没有什么,只是更走近成功一步;

android 手把手教你打造万能的ListView GridView的适配器

相关文章:

你感兴趣的文章:

标签云: