Android ListView 适配器

  ListView 的大体作用是填充数据和用户交互后产生的响应。其绑定数据方式多种,将最近学习的三种总结如下:

  1、ListView 和ArrayAdapter

  (1)建立一个常量类Constant,放置模拟数据

 1 public final class Constant {
 2     //定义一个数组
 3     public static final String[] str = new String[]{"东部", "西部", "南部", "北部", "中部",
 4             "东南部", "西北部", "西南部", "东北部", "中西部", "中南部", "中北部", "其他部"};
 5
 6     private static final String[] str_name = {"柠檬", "苹果", "土豆", "西红柿", "香蕉"};
 7     private static final String[] str_class = {"水果", "水果", "蔬菜", "蔬菜", "水果"};
 8     private static final String[] str_address = {"海南", "吉林", "河南", "广西", "广东"};
 9
10     //把数据放到list中
11     public static List<HashMap<String, Object>> setList() {
12         List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
13         for (int i = 0; i < str_name.length; i++) {
14             HashMap<String, Object> hashMap = new HashMap<String, Object>();
15             hashMap.put("name", str_name[i]);
16             hashMap.put("str_class", str_class[i]);
17             hashMap.put("address", str_address[i]);
18
19             list.add(hashMap);
20         }
21         return list;
22     }
23
24     public static String[] str_arr() {
25         return str;
26     }
27 }

  (2)建立一个ListView的布局文件(activity_arrary.xml)

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
 3     android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
 4     android:paddingRight="@dimen/activity_horizontal_margin"
 5     android:paddingTop="@dimen/activity_vertical_margin"
 6     android:paddingBottom="@dimen/activity_vertical_margin"
 7     tools:context="com.yt.aboutlistview.activity.ArrayActivity">
 8
 9     <TextView android:text="我是ArrayActivity"
10         android:layout_width="wrap_content"
11         android:layout_height="wrap_content"
12         android:id="@+id/textView2" />
13
14     <ListView
15         android:layout_width="wrap_content"
16         android:layout_height="wrap_content"
17         android:id="@+id/lv_arr"
18         android:layout_below="@+id/textView2"
19         android:layout_alignParentLeft="true"
20         android:layout_alignParentStart="true" />
21
22 </RelativeLayout>

  (3)在布局对应的ArrayActivity.java中绑定适配器 

 1 public class ArrayActivity extends Activity {
 2     private ListView lv;
 3     private String[] str = null;
 4     @Override
 5     protected void onCreate(Bundle savedInstanceState) {
 6         super.onCreate(savedInstanceState);
 7 //        str = Constant.str_arr();
 8 //        str = Constant.str;//如果数组公有也可以直接调用
 9         setContentView(R.layout.activity_array);
10         //获取listview对象
11         lv = (ListView) findViewById(R.id.lv_arr);
12         //和适配器绑定
13         lv.setAdapter(
14                 //ArrayAdapter中三个参数,第一个:上下文,第二个listview显示的样式,但三个listview内容
15                 new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,Constant.str_arr()));
16         //监听事件
17         lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
18             @Override
19             public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
20                 Toast.makeText(ArrayActivity.this,"第 "+i+ "行,值是 "+view.toString(),Toast.LENGTH_LONG).show();
21             }
22         });
23     }
24 }

  2、Listview 和SimpleAdapter(本例和下例都要引用1-(1)中的数据)

  (1)建立布局文件activity_simple.xml(布局文件差不多,看具体使用)

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
 3     android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
 4     android:paddingRight="@dimen/activity_horizontal_margin"
 5     android:paddingTop="@dimen/activity_vertical_margin"
 6     android:paddingBottom="@dimen/activity_vertical_margin"
 7     tools:context="com.yt.aboutlistview.activity.SimpleActivity">
 8
 9     <TextView android:text="SimpleAdapter"
10         android:layout_width="wrap_content"
11         android:layout_height="wrap_content"
12         android:id="@+id/textView3" />
13
14     <ListView
15         android:layout_width="wrap_content"
16         android:layout_height="wrap_content"
17         android:id="@+id/lv_simple"
18         android:layout_below="@+id/textView3"
19         android:layout_alignParentLeft="true"
20         android:layout_alignParentStart="true"
21         android:layout_marginTop="45dp" />
22
23 </RelativeLayout>

  (2)ListView的属性文件activity_simple_item.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     >
 6
 7     <TextView
 8         android:layout_width="wrap_content"
 9         android:layout_height="wrap_content"
10         android:text="tv_sim_item_name"
11         android:id="@+id/tv_sim_item_name"
12         android:layout_alignParentTop="true"
13         android:layout_alignParentLeft="true"
14         android:layout_alignParentStart="true"
15         android:textSize="20dp"/>
16
17     <TextView
18         android:layout_width="wrap_content"
19         android:layout_height="wrap_content"
20         android:text="tv_sim_item_class"
21         android:id="@+id/tv_sim_item_class"
22         android:layout_alignParentTop="true"
23         android:layout_alignParentRight="true"
24         android:layout_alignParentEnd="true"
25         android:textSize="30dp"/>
26
27     <TextView
28         android:layout_width="wrap_content"
29         android:layout_height="wrap_content"
30         android:text="New Text"
31         android:id="@+id/tv_sim_item_address"
32         android:layout_below="@+id/tv_sim_item_name"
33         android:layout_alignParentLeft="true"
34         android:layout_alignParentStart="true"
35         android:textSize="15dp"/>
36 </RelativeLayout>

  (3)在布局对应的SimpleActivity.java绑定适配器

 1 public class SimpleActivity extends Activity {
 2     private ListView lv;
 3     List<HashMap<String,Object>> list = null;
 4
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.activity_simple);
 9
10         lv = (ListView) findViewById(R.id.lv_simple);
11         //构造一个数组
12         list = Constant.setList();
13         SimpleAdapter adapter = new SimpleAdapter(this//上下文
14                 ,list//需要显示的数据
15                 ,R.layout.activity_simple_item  //用来显示的布局
16                 , new String[]{"name","str_class","address"}//将数据映射到空间中去
17                 ,new int[]{R.id.tv_sim_item_name,R.id.tv_sim_item_class,R.id.tv_sim_item_address}
18         );
19
20         //绑定数据源
21         lv.setAdapter(adapter);
22         //监听事件
23         lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
24             @Override
25             public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
26                 Toast.makeText(SimpleActivity.this, "第 " + i+1 + "行,值是 " + view.toString(), Toast.LENGTH_LONG).show();
27             }
28         });
29     }
30 }

  3、通用的基础适配器BaseAdapter,直接用2的布局,

  (1) 定义一个适配器MyAdapter.java

 1 public class Myadapter extends BaseAdapter {
 2     private Context context;
 3     private List<HashMap<String,Object>> list;
 4     public Myadapter(Context context,List<HashMap<String,Object>> list){
 5         this.context = context;
 6         this.list = list;
 7     }
 8
 9     @Override
10     public int getCount() {
11         return list.size();
12     }
13
14     @Override
15     public Object getItem(int position) {
16         return list.get(position);
17     }
18
19     @Override
20     public long getItemId(int position) {
21         return position;
22     }
23
24     @Override
25     public View getView(final int position, View view, ViewGroup viewGroup) {
26         ViewHoder hoder = null;
27         if(view == null){
28             view = View.inflate(context,R.layout.activity_simple_item,null);
29             hoder = new ViewHoder();
30
31             hoder.name = (TextView) view.findViewById(R.id.tv_sim_item_name);
32             hoder.str_class = (TextView) view.findViewById(R.id.tv_sim_item_class);
33             hoder.address = (TextView) view.findViewById(R.id.tv_sim_item_address);
34             //绑定ViewHolder对象
35             view.setTag(hoder);
36         }else {
37             hoder = (ViewHoder) view.getTag();
38         }
39         hoder.name.setText(list.get(position).get("name").toString());
40         hoder.str_class.setText(list.get(position).get("str_class").toString());
41         hoder.address.setText(list.get(position).get("address").toString());
42         hoder.str_class.setOnClickListener(new View.OnClickListener() {
43             @Override
44             public void onClick(View view) {
45                 Toast.makeText(context, "第 " + position + "行,name:" + list.get(position).get("name").toString(), Toast.LENGTH_SHORT).show();
46             }
47         });
48         return view;
49     }
50
51     public final class ViewHoder{
52         public TextView name;
53         public TextView str_class;
54         public TextView address;
55     }
56 }

  (2)Activity文件和Adapter进行绑定

 1 public class MyAdapterActivity extends Activity {
 2     private ListView lv ;
 3     private List<HashMap<String,Object>> list;
 4     @Override
 5     protected void onCreate(Bundle savedInstanceState) {
 6         super.onCreate(savedInstanceState);
 7         setContentView(R.layout.activity_simple);//和simple共用
 8         //setContentView(R.layout.activity_my_adapter);
 9         list = Constant.setList();
10         lv = (ListView) findViewById(R.id.lv_simple);
11         Myadapter myadapter = new Myadapter(this, list);
12         lv.setAdapter(myadapter);
13         //如果需要下面可用,需要在activity_simple_item.xml把控件焦点置为失焦
14 //        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
15 //            @Override
16 //            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
17 //                Log.i("","第 "+i+"行,name:"+list.get(i+1).get("name").toString());
18 //            }
19 //        });
20     }
21 }

  都说岁月是一把杀猪刀,美好的一天即将又要开始了,明天还要上班,写得比较简单,主要是为了帮助本人学习记忆,如果对你也有用处,那更好,如果有不明白之处,欢迎留言。如果发现有错误,不管大神和小神路过,请告诉我,以便及时改过,愿我们每天都进步一点点。

  

时间: 2024-10-23 22:02:09

Android ListView 适配器的相关文章

android listview Caused by: java.lang.ArrayIndexOutOfBoundsException: length=3; index=3

android listview 适配器在多种类型viewType报错: Caused by: java.lang.ArrayIndexOutOfBoundsException: length=3; index=3 2 at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:6822) 3 at android.widget.AbsListView.trackMotionScroll(AbsListView.j

Android——ListView布局+适配器(三)

Android--ListView布局+适配器(三) package com.example.administrator.newstop; import android.os.Bundle; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import andro

Android——ListView多布局+适配器(二)

Android--ListView多布局+适配器(二) <span style="font-size:18px;">package com.example.administrator.newstop.entity; /** * Created by Administrator on 2016/8/4. */ public class News { private String title; private String pubDate; private int img; p

Android——ListView与适配器

Android--ListView与适配器 1.抽屉布局  Drawer <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.

android之ListView,详细介绍实现步骤,举例,自定义listview适配器

android之ListView,详细介绍实现步骤,举例,自定义listview适配器 09. 四 / android基础 / 没有评论 本文来源于www.ifyao.com禁止转载!www.ifyao.com android中如何使用listView是比较重要的,因为很多时候都需要将数据库中的数据以列表显示, 具体使用步骤:大体 1,建立一个item.xml文件,此布局文件布局布局如何具体显示列表中的每一个条目 2,在要使用listview的界面中添加listview控件. 3,activit

Android listview的适配器以及各种监听、效率的提升

之前写过一篇关于listview的博客,现在感觉那篇博客关于listview认识不够全面.但有些方法还是可取,例如灵活的监听,写适配器.链接在这里android listview长按,单击各种事件捕捉.那个单击监听是一项项设置监听,效率也不好. 不断工作的过程,也是不断总结过程.现在对于listview有了更透彻的理解,所以重新写了一个实践demo.这个demo有涉及到listview的数据源,布局,适配器以及各种监听.效率的提升.现在对于这些理解,想写出一个通用的适配器,但发现还是有点困难,就

Android开发之适配器-ListView适配器的重复数据

适配器是Android中的数据与View视图的桥梁,作用就是将数据通过适配器显示到对应的View视图上. 工作中,在用ListView做适配器数据时候,有些人肯定碰见过,如何优化效率,但是又出现重复数据的情况,如何避免重复数据而且又能提高ListView大数据量时候的效率呢?,解决方案就是2点: 1. 在getView方法中 进行View的判断,即做convertView ==null 这样的判断,这样是为了提高数据量大的时候的效率. 2.设置数据用setTag()/getTag()方法来进行对

android listview级联三菜单选择地区,本地数据库sqlite级联地区,item选中不变色

前言:因为找了N多网上的资源都没有好的解决方案,别人都是只给思路没给具体源码,真TMD纠结,干嘛求别人,自己动手才是真,最痛恨那些所谓大牛的作风,给了点点代码就让别人去想,你让我们这种小白情何于堪!!!!!!此例是基于listview来实现本地sqlite实现的! 二话不说,程序猿求的是有图有真相有源码!大家下载后有什么问题可以找到本人:QQ508181017 核心代码如下 1.数据库操作类 package com.icq.demo.db; import java.util.ArrayList;

最新一课 老师指点用Listview适配器

上课前 <?xml version="1.0" encoding="utf-8"?>    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"       android:layout_width="fill_parent"       android:layout_height="fill_parent&qu