BaseAdapter&ArrayAdapter在ListView中应用

一:BaseAdapter:共同实现的基类的适配器,是ArrayAdapter SimpleAdapter等的父类,

  一般用于比较复杂的ListView,扩展性强。

  详细信息可查看谷歌官方API:http://developer.android.com/reference/android/widget/BaseAdapter.html

  1:构造方法:BaseAdapter();

  2:公共方法:

  

  ArrayAdapter:所支持的一个具体BaseAdapter任意对象数组。这个类在默认情况下预计提供的资源id引用一个TextView。如果您希望使用更复杂的布局,使用构造函数,还需要一个字段id。该字段id应该引用一个TextView在大布局资源。

          使用简单轻便。

  详细信息可查看谷歌官方API:http://developer.android.com/reference/android/widget/ArrayAdapter.html

  构造方法:

  其中:ArrayAdapter(Context context, int resource, List<T> objects)较为常用;

  公共方法:

二:案例学习:

  1:应用App功能展示:

   

  2:布局代码为:activity_main.xml     imagelistview.xml    textlistview.xml

activity_main.xml:

 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="horizontal"
 6     android:paddingBottom="@dimen/activity_vertical_margin"
 7     android:paddingLeft="@dimen/activity_horizontal_margin"
 8     android:paddingRight="@dimen/activity_horizontal_margin"
 9     android:paddingTop="@dimen/activity_vertical_margin"
10     tools:context=".MainActivity">
11
12     <ListView
13         android:id="@+id/listview_main"
14         android:layout_width="wrap_content"
15         android:layout_height="match_parent"
16         android:layout_weight="1"></ListView>
17
18     <ListView
19         android:id="@+id/listText_item"
20         android:layout_width="wrap_content"
21         android:layout_height="match_parent"
22         android:layout_weight="2">
23
24
25     </ListView>
26 </LinearLayout>

imagelistview.xml:

 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="match_parent"
 5     android:orientation="horizontal">
 6
 7     <ImageView
 8         android:id="@+id/iamge_item"
 9         android:layout_width="60dp"
10         android:layout_height="90dp"
11         android:background="@drawable/image1"/>
12
13     <LinearLayout
14         android:layout_width="match_parent"
15         android:layout_height="wrap_content"
16         android:orientation="vertical">
17
18         <TextView
19             android:id="@+id/title_item"
20             android:layout_width="match_parent"
21             android:layout_height="20dp"
22             android:text="标题" />
23
24         <ScrollView
25             android:layout_width="match_parent"
26             android:layout_height="70dp">
27
28             <TextView
29                 android:id="@+id/content_item"
30                 android:layout_width="match_parent"
31                 android:layout_height="match_parent"
32                 android:text="内容" />
33         </ScrollView>
34
35     </LinearLayout>
36 </LinearLayout>

textlistview.xml:

1 <?xml version="1.0" encoding="utf-8"?>
2 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
3     android:layout_width="match_parent"
4     android:layout_height="30dp"
5     android:orientation="vertical"
6     android:scrollbars="vertical"></TextView>

  3:Activity代码为:

Msg对象类如下:

 1 package activity.cyq.listviewlearn;
 2
 3 /**
 4  * Created by Android_007 on 2015/8/4.
 5  */
 6 public class Msg {
 7
 8     public int iconId;
 9     public String title;
10     public String content;
11
12     public Msg(int iconId, String title, String content) {
13         this.iconId = iconId;
14         this.title = title;
15         this.content = content;
16     }
17
18     public int getIconId() {
19         return iconId;
20     }
21
22     public void setIconId(int iconId) {
23         this.iconId = iconId;
24     }
25
26     public String getTitle() {
27         return title;
28     }
29
30     public void setTitle(String title) {
31         this.title = title;
32     }
33
34     public String getContent() {
35         return content;
36     }
37
38     public void setContent(String content) {
39         this.content = content;
40     }
41 }

Maincity代码:

  1 package activity.cyq.listviewlearn;
  2
  3 import android.app.AlertDialog;
  4 import android.content.DialogInterface;
  5 import android.support.v7.app.AppCompatActivity;
  6 import android.os.Bundle;
  7 import android.view.LayoutInflater;
  8 import android.view.View;
  9 import android.view.ViewGroup;
 10 import android.widget.AdapterView;
 11 import android.widget.ArrayAdapter;
 12 import android.widget.BaseAdapter;
 13 import android.widget.ImageView;
 14 import android.widget.LinearLayout;
 15 import android.widget.ListView;
 16 import android.widget.TextView;
 17 import android.widget.Toast;
 18 import java.util.ArrayList;
 19
 20 public class MainActivity extends AppCompatActivity {
 21
 22     private ListView leftView;
 23     private ListView rightView;
 24     private BaseAdapter adapter_image;  /*左边含image的列表适配器*/
 25     private ArrayAdapter adapter_Text;  /*右边含text的列表适配器*/
 26     private ArrayList<Msg> list_image = new ArrayList<>();
 27     private ArrayList<String> list_Text = new ArrayList<>();
 28
 29     @Override
 30     protected void onCreate(Bundle savedInstanceState) {
 31         super.onCreate(savedInstanceState);
 32         setContentView(R.layout.activity_main);
 33         /**/
 34         leftView = (ListView) findViewById(R.id.listview_main);
 35         rightView = (ListView) findViewById(R.id.listText_item);
 36
 37         /*为list_image添加数据*/
 38         list_image.add(new Msg(R.drawable.image1, "title 1", "context 1"));
 39         list_image.add(new Msg(R.drawable.image2, "title 2", "context 2"));
 40         list_image.add(new Msg(R.drawable.image3, "title 3", "context 3"));
 41         list_image.add(new Msg(R.drawable.image4, "title 4", "context 4"));
 42         /*为list_Text添加数据*/
 43         for (int i = 0; i < 12; i++) {
 44             list_Text.add("这是ArrayAdapter适配器生成的第" + (i + 1) + "条数据");
 45         }
 46
 47         /*获得左侧列表的适配器 adapter_image 匿名类实例化 并实现四个方法 */
 48         adapter_image = new BaseAdapter() {
 49             /*返回数据条数*/
 50             @Override
 51             public int getCount() {
 52                 return list_image.size();
 53             }
 54
 55             /*返回每一项数据*/
 56             @Override
 57             public Msg getItem(int position) {
 58                 return list_image.get(position);
 59             }
 60
 61             /*返回该项数据的索引指*/
 62             @Override
 63             public long getItemId(int position) {
 64                 return position;
 65             }
 66
 67             /*构造列表项的视图,并返回*/
 68             @Override
 69             public View getView(final int position, View convertView, ViewGroup parent) {
 70             /* convertView 是回收的item视图 回收视图的再利用可减少每次在内存中新建一个视图 提高程序性能 */
 71                 LinearLayout ll = null;
 72                 if (convertView == null) {
 73                     /*获得item视图*/
 74                     ll = (LinearLayout) LayoutInflater.from(MainActivity.this).inflate(R.layout.imagelistview, null);
 75                 }
 76                 if (convertView != null) {
 77                     /*使用回收视图 */
 78                     ll = (LinearLayout) convertView;
 79                 }
 80
 81                 ImageView icon = (ImageView) ll.findViewById(R.id.iamge_item);/*注意ll这个View容器下获findViewById(R.id.**)*/
 82                 TextView title_ = (TextView) ll.findViewById(R.id.title_item);
 83                 TextView content_ = (TextView) ll.findViewById(R.id.content_item);
 84
 85                 icon.setImageResource(getItem(position).iconId); /*调用上面的geeItem方法 获得Msg对象 */
 86                 title_.setText(getItem(position).title);
 87                 content_.setText(getItem(position).content);
 88
 89                 /*item的点击事件*/
 90                 ll.setOnClickListener(new View.OnClickListener() {
 91                     @Override
 92                     public void onClick(View v) {
 93                         Toast.makeText(MainActivity.this, "你点击了第" + (position + 1) + "个列表项。", Toast.LENGTH_SHORT).show();
 94
 95                     }
 96                 });
 97                 /*item子元素的点击事件*/
 98                 icon.setOnClickListener(new View.OnClickListener() {
 99                     @Override
100                     public void onClick(View v) {
101                         Toast.makeText(MainActivity.this, "你点击了第" + (position + 1) + "张图片。", Toast.LENGTH_SHORT).show();
102                     }
103                 });
104
105                 /*item长按事件 实现删除该item*/
106                 ll.setOnLongClickListener(new View.OnLongClickListener() {
107                     @Override
108                     public boolean onLongClick(View v) {
109                         new AlertDialog.Builder(MainActivity.this)
110                                 .setTitle("警告!")
111                                 .setMessage("确认删除该项?")
112                                 .setIcon(R.drawable.delete)
113                                 .setPositiveButton("是", new DialogInterface.OnClickListener() {
114                                     @Override
115                                     public void onClick(DialogInterface dialog, int which) {
116                                        /*如何删除该项数据  ???*/
117                                         list_image.remove(position);
118                                         leftView.setAdapter(adapter_image);
119                                     }
120                                 })
121                                 .setNegativeButton("否", null)
122                                 .show();
123                         return true;/* true:接受系统自定义的反馈,比如震动,音效等  false:无反馈 */
124                     }
125                 });
126                 return ll;
127             }
128         };
129
130         /*右侧的ArrayAdapter适配器  通过匿名类实现。也可以通过子类继承ArrayAdapter */
131         //adapter_Text = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1, list_Text);/*这列代码,使用的是android系统自带的资源*/
132         adapter_Text = new ArrayAdapter(MainActivity.this, R.layout.textlistveiw, list_Text); /* 使用自定义的资源文件 该文件标签只能<TextView/> */
133         /*item的点击事件*/
134         rightView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
135             @Override
136             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
137                 Toast.makeText(MainActivity.this, "你点击了第" + (position + 1) + "个Item项", Toast.LENGTH_SHORT).show();
138             }
139         });
140         /*iitem长按删除改项的事件*/
141         rightView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
142             @Override
143             public boolean onItemLongClick(AdapterView<?> parent, final View view, final int position, long id) {
144                 new AlertDialog.Builder(MainActivity.this)
145                         .setTitle("警告")
146                         .setMessage("是否删除该项?")
147                         .setIcon(R.drawable.delete)
148                         .setPositiveButton("是", new DialogInterface.OnClickListener() {
149                             @Override
150                             public void onClick(DialogInterface dialog, int which) {
151                                 /*  adapter_Text.remove(position); 不能这样使用
152                                     查看谷歌的Guide API得知 ArrayAdapter.remove(object)
153                                     这个方法的作用的删除数组中指定的对象 显然我们删除索引是行不通的
154                                     所以我们需要删除ArrayAdapter中的object对象,也就是list_Text[position]
155                                     adapter_Text.remove(list_Text.get(position));
156                                     rightView.setAdapter(adapter_Text);
157                                    */
158                                 list_Text.remove(position);
159                                 rightView.setAdapter(adapter_Text);
160                             }
161                         })
162                         .setNegativeButton("否", null)
163                         .show();
164                 return true;
165             }
166         });
167
168         /*为试图添加适配器*/
169         leftView.setAdapter(adapter_image);
170         rightView.setAdapter(adapter_Text);
171     }
172
173 }
时间: 2024-10-14 00:54:02

BaseAdapter&ArrayAdapter在ListView中应用的相关文章

安卓解析json,使用BaseAdapter添加至ListView中,中间存储用JavaBean来实现

这是一个小练习,要求解析一个提供的json文件.并将其中的id,title值获取,以ListView形式展示出来.(开发工具是android studio) 下面开始: 首先我想到的是先把json文件内容读进一个String类型的变量中去保存,然后再对字符串进行解析.Id和title可以看做为一组数据,然后整个文件有很多组数据,所以创建了 1 ArrayList<HashMap> ArrayList=new ArrayList<>(); list中保存所有条数据,需要时再获取.所以

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中的Item需要用ListView来展现处理后的内容,然后就遇到了一个很头疼的问题,作为Item的ListView没法进行滑动,而且显示也不正常,只是显示几个子Item.不能将子Item全部显示,原因是在控件绘制出来之前要对ListView的大小进行计算,要解决将子ListView全部显示出来的问题,就是重新计算一下其大小告知系统即可.后面这个问题比较好解决,网上已经给出解决方案: 前辈们给出了一个方法,重新计算子ListView的大小,然后在设置本ListVi

listview中的adapter学习小结

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

ImageLoader在Listview中的使用

图片加载框架之ImageLoader 1_特点 1)多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等 2)支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置 3)支持图片的内存缓存,文件系统缓存或者SD卡缓存 4)支持图片下载过程的监听 5)根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存 6)较好的控制图片的加载过程,例如暂停图片加载,重

Gridview, ListView中的item含有checkbox,setOnItemClickListener方法失效的问题

1) 设置CheckBoxandroid:clickable="false"  通过外部View的点击改变其状态. <CheckBox android:id="@+id/select_tag" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@+id/album

Android ListView 中的onItemClick方法中Intent 无法跳转的解决方案

I found this somewhere after googling There will be case that your custom list item doesn’t respond when you click…so what’s the reason and what’s the solution? Here several problems and solutions: 1. Scenario: list item layout contains CheckBox Prob

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

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

Android 如何在 ListView 中更新 ProgressBar 进度

=======================ListView原理============================== Android 的 ListView 的原理打个简单的比喻就是: 演员演小品(假设演员都长一样,每个角色任何演员都可以演) 小品剧也不会为每个角色都招募一个演员.ListView 不会为每一个 Item 创建 View 对象. 小品剧的演员在一个角色表演完成后,会在后台换下一个角色的服装,等待需要表演的时候再出场. ListView 会让未显示的 View 填充数据后缓