常见的适配器总结

学习适配器有一段时间了,现在对BaseAdapter的优化和要是项目中用到的适配其很多的话,完全可以建立一个SimpleBaseAdapter(继承自BaseAdapter),方便扩展.

主布局代码:

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical"
 6     tools:context=".MainActivity">
 7
 8     <ListView
 9         android:id="@+id/listview"
10         android:layout_width="wrap_content"
11         android:layout_height="wrap_content"
12         />
13
14 </LinearLayout>

item的布局:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="wrap_content"
 5     android:background="@drawable/bread__selector_pink_item"
 6     android:orientation="horizontal"
 7     android:gravity="center"
 8     android:padding="10dp">
 9
10     <RelativeLayout
11         android:id="@+id/shop_info"
12         android:layout_width="fill_parent"
13         android:layout_height="wrap_content"
14         android:gravity="center_vertical"
15         android:paddingRight="12dp"
16         android:paddingLeft="12dp">
17
18         <TextView
19             android:id="@+id/student_name"
20             android:layout_width="match_parent"
21             android:layout_height="wrap_content"
22             android:text="东海堂天河公园店"
23             android:textSize="14sp" />
24
25         <TextView
26             android:id="@+id/student_addr"
27             android:layout_width="match_parent"
28             android:layout_height="wrap_content"
29             android:layout_below="@+id/student_name"
30             android:layout_marginTop="10dp"
31             android:text="广州天河区建业路华翠街"
32             android:textColor="@color/font_gray"
33             android:textSize="10sp" />
34
35     </RelativeLayout>
36
37 </LinearLayout>

现在来说说BaseAdapter的优化,目前通用的优化就是ViewHolder,在getView()方法中,首次对convertView非空的处理,convertView会绑定一个ViewHolder对象,这个viewHolder主要用于帮convertView存储布局中的控件。了解这个就可以了.

来看看BaseAdapter的写法:

 1 package com.fightzhao.myadapter1.ui.adapter;
 2
 3 import android.content.Context;
 4 import android.view.LayoutInflater;
 5 import android.view.View;
 6 import android.view.ViewGroup;
 7 import android.widget.BaseAdapter;
 8 import android.widget.TextView;
 9
10 import com.fightzhao.myadapter1.R;
11 import com.fightzhao.myadapter1.dao.Student;
12
13 import java.util.ArrayList;
14
15 /**
16  * Created by fightzhao on 15-9-16.
17  */
18 public class FirstAdapter extends BaseAdapter {
19     private ArrayList<Student> data;
20     private Context context;
21 //    private Student chosenStudent;
22
23     public FirstAdapter(Context context, ArrayList<Student> data) {
24         this.context = context;
25         this.data = data == null ? new ArrayList<Student>() : data;
26     }
27
28     @Override
29     public int getCount() {
30         return data.size();
31     }
32
33     @Override
34     public Object getItem(int position) {
35         if (position > data.size())
36             return null;
37         return data.get(position);
38     }
39
40     @Override
41     public long getItemId(int position) {
42         return position;
43     }
44
45     @Override
46     public View getView(int position, View convertView, ViewGroup parent) {
47         ViewHolder holder;
48         if (null == convertView) {
49             convertView = LayoutInflater.from(context).inflate(R.layout.item_student, null);
50             holder = new ViewHolder();
51             holder.student_name = (TextView) convertView.findViewById(R.id.student_name);
52             holder.student_addr = (TextView) convertView.findViewById(R.id.student_addr);
53             convertView.setTag(holder);
54         } else {
55             holder = (ViewHolder) convertView.getTag();
56         }
57         holder.student_name.setText(data.get(position).getName());
58         holder.student_addr.setText(data.get(position).getAddr());
59         return convertView;
60     }
61
62     class ViewHolder {
63         TextView student_name;
64         TextView student_addr;
65     }
66 //    public void setChosenStudent(Student student){
67 //        chosenStudent = student;
68 //        notifyDataSetChanged();
69 //    }
70 //    public Student getChosenStudent(){
71 //        return chosenStudent;
72 //    }
73 }

这里的Student就是以模拟数据,不贴代码了.

如果项目中用到的适配器不是很多的话,用这个是没问题的,但是,为了更好扩展的话,看来下张奇大大的做法,这里直接引用:

Android简便通用的SimpleBaseAdapter 链接:http://www.stormzhang.com/androidtips/2014/08/31/android-common-simplebaseadapter/

代码:

  1 package com.fightzhao.myadapter1.ui.adapter;
  2
  3 import android.content.Context;
  4 import android.util.SparseArray;
  5 import android.view.View;
  6 import android.view.ViewGroup;
  7 import android.widget.BaseAdapter;
  8
  9 import java.util.ArrayList;
 10 import java.util.List;
 11
 12 /**
 13  * Created by fightzhao on 15-9-16.
 14  */
 15 public abstract class SimpleBaseAdapter<T> extends BaseAdapter {
 16     protected Context context;
 17     protected List<T> data;
 18
 19     public SimpleBaseAdapter(Context context, List<T> data) {
 20         this.context = context;
 21         this.data = data == null ? new ArrayList<T>() : new ArrayList<T>(data);
 22     }
 23
 24     @Override
 25     public int getCount() {
 26         return data.size();
 27     }
 28
 29     @Override
 30     public Object getItem(int position) {
 31         if (position >= data.size())
 32             return null;
 33         return data.get(position);
 34     }
 35
 36     @Override
 37     public long getItemId(int position) {
 38         return position;
 39     }
 40
 41     /**
 42      * 该方法需要子类实现,需要返回item布局的resource id
 43      *
 44      * @return
 45      */
 46     public abstract int getItemResource();
 47
 48     /**
 49      * 使用该getItemView方法替换原来的getView方法,需要子类实现
 50      *
 51      * @param position
 52      * @param convertView
 53      * @param holder
 54      * @return
 55      */
 56     public abstract View getItemView(int position, View convertView, ViewHolder holder);
 57
 58     @SuppressWarnings("unchecked")
 59     @Override
 60     public View getView(int position, View convertView, ViewGroup parent) {
 61         ViewHolder holder;
 62         if (null == convertView) {
 63             convertView = View.inflate(context, getItemResource(), null);
 64             holder = new ViewHolder(convertView);
 65             convertView.setTag(holder);
 66         } else {
 67             holder = (ViewHolder) convertView.getTag();
 68         }
 69         return getItemView(position, convertView, holder);
 70     }
 71
 72     public class ViewHolder {
 73         private SparseArray<View> views = new SparseArray<View>();
 74         private View convertView;
 75         public ViewHolder(View convertView) {
 76             this.convertView = convertView;
 77         }
 78         /**
 79          * 通过控件的Id获取对应的控件,如果没有则加入views
 80          *
 81          * @param resId
 82          * @param <T>
 83          * @return
 84          */
 85         @SuppressWarnings("unchecked")
 86         public <T extends View> T getView(int resId) {
 87             View v = views.get(resId);
 88             if (null == v) {
 89                 v = convertView.findViewById(resId);
 90                 views.put(resId, v);
 91             }
 92             return (T) v;
 93         }
 94     }
 95
 96     public void add(T t) {
 97         data.add(t);
 98         notifyDataSetChanged();
 99     }
100
101     public void addAll(List<T> elem) {
102         data.addAll(elem);
103         notifyDataSetChanged();
104     }
105
106     public void remove(T elem) {
107         data.remove(elem);
108         notifyDataSetChanged();
109     }
110
111     public void remove(int index) {
112         data.remove(index);
113         notifyDataSetChanged();
114     }
115
116     public void replaceAll(List<T> elem) {
117         data.clear();
118         data.addAll(elem);
119         notifyDataSetChanged();
120     }
121 }

使用:

 1 package com.fightzhao.myadapter1.ui.adapter;
 2
 3 import android.content.Context;
 4 import android.view.View;
 5 import android.widget.TextView;
 6
 7 import com.fightzhao.myadapter1.R;
 8 import com.fightzhao.myadapter1.dao.Student;
 9
10 import java.util.List;
11
12 /**
13  * Created by fightzhao on 15-9-16.
14  */
15 public class SecoundAdapter extends SimpleBaseAdapter<Student> {
16     public SecoundAdapter(Context context, List<Student> data) {
17         super(context, data);
18     }
19     @Override
20     public int getItemResource() {
21         return R.layout.item_student;
22     }
23     @Override
24     public View getItemView(int position, View convertView, ViewHolder holder) {
25         TextView student_name = holder.getView(R.id.student_name);
26         TextView student_addr = holder.getView(R.id.student_addr);
27         student_name.setText(data.get(position).getName());
28         student_addr.setText(data.get(position).getAddr());
29         return convertView;
30     }
31 }

之后在MainActivity中使用即可:

 1 package com.fightzhao.myadapter1;
 2
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.view.View;
 6 import android.widget.AdapterView;
 7 import android.widget.ListView;
 8 import android.widget.Toast;
 9
10 import com.fightzhao.myadapter1.dao.Student;
11 import com.fightzhao.myadapter1.ui.adapter.FirstAdapter;
12 import com.fightzhao.myadapter1.ui.adapter.SecoundAdapter;
13
14 import java.util.ArrayList;
15
16 public class MainActivity extends Activity {
17     private ListView listView;
18     private ArrayList<Student> data;
19     private FirstAdapter firstAdapter;
20     SecoundAdapter secoundAdapter;
21
22     @Override
23     protected void onCreate(Bundle savedInstanceState) {
24         super.onCreate(savedInstanceState);
25         setContentView(R.layout.activity_main);
26         initView();
27         initData();
28 //        firstAdapter = new FirstAdapter(this,data);
29 //        listView.setAdapter(firstAdapter);
30         secoundAdapter =new SecoundAdapter(this,data);
31         listView.setAdapter(secoundAdapter);
32
33     }
34
35
36     private void initView() {
37         listView = (ListView) findViewById(R.id.listview);
38         listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
39             @Override
40                 public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
41                 Student student = (Student) parent.getItemAtPosition(position);
42 //                firstAdapter.setChosenStudent(student);
43                 if(view.hasFocusable()){
44                     view.setBackgroundResource(R.color.item_pink);
45                 }
46
47                 Toast.makeText(getApplicationContext(),"sad",Toast.LENGTH_SHORT).show();
48             }
49         });
50
51     }
52
53
54
55
56
57     private void initData() {
58         data = new ArrayList<>();
59         data.add(new Student("张三", "北京"));
60         data.add(new Student("张学友", "香港"));
61         data.add(new Student("周杰伦", "台湾"));
62         data.add(new Student("梁朝伟", "香港"));
63         data.add(new Student("李四", "合肥"));
64
65
66     }
67
68 }
时间: 2024-10-09 20:16:36

常见的适配器总结的相关文章

适配器控件-Adapter

适配器对象派生自Android.widget.Adapter,它的作用包括:构造列表项控件,并将数据项绑定到列表项控件中. 常见的适配器有:数组适配器 ArrayAdapter,数据库适配器 CursorAdapter. 使用适配器对象的实例如下: //定义数据 String []  data = new String[] {"早上好","中午好","晚上好"}; //定义适配器,并设置数据源 ArrayAdapter<String>

Kotlin入门(22)适配器的简单优化

列表视图 为实现各种排列组合类的视图(包括但不限于Spinner.ListView.GridView等等),Android提供了五花八门的适配器用于组装某个规格的数据,常见的适配器有:数组适配器ArrayAdapter.简单适配器SimpleAdapter.基本适配器BaseAdapter.翻页适配器PagerAdapter.适配器的种类虽多,却个个都不好用,以数组适配器为例,它与Spinner配合实现下拉框效果,其实现代码纷复繁杂,一直为人所诟病.故而在下拉框一小节之中,干脆把ArrayAda

[Android]GOF23种设计模式 &amp; Android中的设计模式

GOF23种设计模式 设计原则: 1. 单一职责原则(SRP):就一个类而言,应该仅有一个引起它变化的原因 2. 开放-封闭原则(OCP):软件实体(类.模块.函数等)应该可以扩展,但是不可修改.即对于扩展是开放的, 对于修改是封闭的. 3. 依赖倒转原则: A. 高层模块不应该依赖低层模块,两个都应该依赖抽象.B.抽象不应该依赖细节,细节应该依赖抽象.说白了,就是要针对接口编程,不要对实现编程. 4. 迪米特法则(LoD):如果两个类不必彼此直接通信,那么这两个类就不应该发生直接的相互作用.如

安卓第三天

获取SD卡和内存的空间信息的实现代码 获取SDCard内存信息 * @param view */ public void sdCardInfo(View view){ File storageDirectory = Environment.getExternalStorageDirectory(); *  返回该路径下文件的总大小,单位是字节.如果该路径不存在则返回0 long totalSpace = storageDirectory.getTotalSpace(); long usableS

03-数据库

数据库 mysql sqlserver SQLite(轻量级,嵌入式的数据库) 大量的相似结构的数据的储存,快速的查询.特殊的文件(按照一定的格式生成) 数据库的创建 创建文件 1.声明文件对象,文件是不会被创建出来的. File file = new File("文件名称"); 2.写文件(文件才会被创建出来) FileOutputStream fos = new FileOutputStream(file); fos.write("hdahfdsaklfh".g

Android界面编程——Android高级UI组件(三)

Android界面编程 Android高级UI组件 2.4.1适配器组件 适配器的作用 适配器充当适配器控件和该视图数据之间的桥梁.适配器提供访问的数据项,并负责产生数据组中的每个项的视图. 常用的适配器 BaseAdapter:抽象类,具有较高的灵活性. ArrayAdapter:最为简单,智能展示一行文字. SimpleAdapter:有较好的扩充性,可以自定义出各种效果. SimpleCursorAdapter:主要用于操作数据库. 常用的适配器控制 适配器控件扩展自ViewAdapter

安卓ListView的使用

1.简单介绍ListView       listview是一个以垂直方式在项目中显示视图的列表.是一种不能实现确定视图中的内容的适配器视图(adapter view).数据和视图的绑定,需要通过继承ListViewAdapter接口的适配器实现.确保当上下滚动的时候,能够动态刷新视图内容.通常我们都会自定义一个继承自BaseAdapter(已继承ListViewAdapter),ArrayAdapter(继承自BaseAdapter),SimpleAdapter(继承自BaseAdapter)

光纤网卡插槽及接口的介绍

光纤以太网卡主要应用于光纤以太网通信技术,光纤网卡能够为用户在快速以太网网络上的计算机提供可靠的光纤连接,特别适合于接入信息点的距离超出五类线接入距离(100m)的场所,可彻底取代普遍采用RJ45接口以太网外接光电转换器的网络结构,为用户提供可靠的光纤到户和光纤到桌面的解决方案.用户可根据使用场合选择光纤接口参数(包括连接头.单/多模光纤.工作距离等). 插槽的分类 PCI PCI这种总线类型的网卡在当前的台式机上相当普遍,也是目前最主流的一种网卡接口类型.因为它的I/O 比ISA总线型的网卡快

如何选择好的光纤适配器?

光纤适配器,是光纤活动连接器对中连接部件.光纤适配器可精密对接光纤的两个端面,以使发射光纤输出的光能量能最大限度地耦合到接收光纤中去,实行相同或不同光纤活动连接器的对接,使其在很少的损耗下实行光路畅通. 随着光纤适配器在光纤连接中的广泛应用,有各种不同接口的光纤适配器可供选择,以适应不同的环境安装需求.常见的适配器种类有:LC适配器,FC适配器,SC适配器,ST适配器,E2000适配器,MTP / MPO适配器等. 面对如此多种类的适配器,如何选择合适并且质量优良的适配器则显得尤为重要.一般而言