android ListView进阶

ListView

1.在android
开发中很多时候都要用到ListView的这个控件的,但用这个控件的时候会遇到一些问题,如在ListView中有Button按钮,就需要将按钮的监听事件给分离出来,且将Button该为自己的定义的Button控件

这只是一个思路,在进行例子之前,对一些小的知识点进行一下复习:

2.API是开发中最好的老师,它对ListView的解释是:

3.这里就对ListView运行机制做个解释(引用别人的一段话):

listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listView的长度(这也是为什么在开始的第一张图特
别的标出列表长度),然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,列表将不显示同样 return
1,就只显示一行。  系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必须手动映射数据,这需要重写
getView()方法。系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position表示将显示的是第几
行,covertView是从布局文件中inflate来的布局。我们用LayoutInflater的方法将定义好的vlist2.xml文件提取成
View实例用来显示。然后将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。但是按钮
为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。至此一个自定义的listView就完成了,现在让我们回过头从新审视这个过程。系统
要绘制ListView了,他首先获得要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里面首先获得一
个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示之。好了,绘制完这一行了。那
再绘制下一行,直到绘完为止。在实际的运行过程中会发现listView的每一行没有焦点了,这是因为Button抢夺了listView的焦点,只要布
局文件中将Button设置为没有焦点就OK了

4.在给按钮添加OnClickListener的时候,一开始很下意识的会想在ListView的adapter的getView方法中找到每个
Button并new一个OnClickListener分配给这个button。但是当数据量很大的时候,new出来这么多个监听器势必会对内存造成一
定的压力,而且每个Listener的功能完全一样,Listener里面所需知道的

  所以自定一个MyOnClickListener(用了单例模式,这样就不会造成new了很多同一个对象了)


 1 public class MyOnClickListener implements OnClickListener {
2
3 private static MyOnClickListener instance;
4 private Context context;
5
6 public MyOnClickListener() {
7 }
8
9 public static MyOnClickListener instance() {
10 if (instance == null) {
11
12 instance = new MyOnClickListener();
13 }
14
15 return instance;
16 }
17
18 @Override
19 public void onClick(View v) {
20 MyButton button = (MyButton) v;
21 String userID = button.getUserID();
22 Toast.makeText(context, "所获得的用户ID为:" + userID, Toast.LENGTH_SHORT)
23 .show();
24 }
25
26 /**
27 * @return the context
28 */
29 public Context getContext() {
30 return context;
31 }
32
33 /**
34 * @param context
35 * the context to set
36 */
37 public void setContext(Context context) {
38 this.context = context;
39 }
40
41 }

5.因为要从外面获取参数别进行处理,而处理是交给MyOnClickListener的,而MyOnClickLister能获取到的就是Button了,这时就需要一个自己定的Button(MyButton)来获取到外部数据:

MyButton:


 1 public class MyButton extends Button {
2
3 private String userID;
4
5 public MyButton(Context context) {
6 super(context);
7 }
8
9 public MyButton(Context context, AttributeSet attrs) {
10 super(context, attrs);
11 }
12
13 public MyButton(Context context, AttributeSet attrs, int defstyle) {
14 super(context, attrs, defstyle);
15 }
16
17 /**
18 * @return the userID
19 */
20 public String getUserID() {
21 return userID;
22 }
23
24 /**
25 * @param userID
26 * the userID to set
27 */
28 public void setUserID(String userID) {
29 this.userID = userID;
30 }
31
32 }

6.主要的两个类都完成了,现在就是很普通的一些东西了

MianActivity:


 1 public class MainActivity extends Activity {
2
3 private ListView listView;
4 private List<HashMap<String, Object>> list;
5
6 @Override
7 protected void onCreate(Bundle savedInstanceState) {
8 super.onCreate(savedInstanceState);
9 setContentView(R.layout.activity_main);
10 initData();
11 listView = (ListView)findViewById(R.id.listView);
12 MyAdapter adapter = new MyAdapter();
13 listView.setAdapter(adapter);
14 }
15
16 private void initData() {
17 list = new ArrayList<HashMap<String, Object>>();
18 HashMap<String, Object> map1 = new HashMap<String, Object>();
19 map1.put("image", R.drawable.ic_launcher);
20 map1.put("userID", "1");
21 HashMap<String, Object> map2 = new HashMap<String, Object>();
22 map2.put("image", R.drawable.ic_launcher);
23 map2.put("userID", "2");
24 HashMap<String, Object> map3 = new HashMap<String, Object>();
25 map3.put("image", R.drawable.ic_launcher);
26 map3.put("userID", "3");
27 HashMap<String, Object> map4 = new HashMap<String, Object>();
28 map4.put("image", R.drawable.ic_launcher);
29 map4.put("userID", "4");
30 HashMap<String, Object> map5 = new HashMap<String, Object>();
31 map5.put("image", R.drawable.ic_launcher);
32 map5.put("userID", "5");
33 list.add(map1);
34 list.add(map2);
35 list.add(map3);
36 list.add(map4);
37 list.add(map5);
38
39 }
40
41 public class MyAdapter extends BaseAdapter {
42
43 @Override
44 public int getCount() {
45 return list.size();
46 }
47
48 @Override
49 public Object getItem(int position) {
50 return list.get(position);
51 }
52
53 @Override
54 public long getItemId(int position) {
55 return position;
56 }
57
58 @Override
59 public View getView(int position, View convertView, ViewGroup parent) {
60 View view = LayoutInflater.from(MainActivity.this).inflate(
61 R.layout.item, null);
62 TextView textView = (TextView) view.findViewById(R.id.userID);
63 textView.setText((CharSequence) list.get(position).get("userID"));
64 MyButton button = (MyButton) view.findViewById(R.id.button);
65 button.setUserID((String) list.get(position).get("userID"));
66 button.setOnClickListener(MyOnClickListener.instance());
67 MyOnClickListener.instance().setContext(MainActivity.this);
68 return view;
69 }
70
71 }
72
73 @Override
74 public boolean onCreateOptionsMenu(Menu menu) {
75 getMenuInflater().inflate(R.menu.main, menu);
76 return true;
77 }
78
79 }

7.ListView中的每个item布局文件

item.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/image"
9 android:layout_width="wrap_content"
10 android:layout_height="wrap_content"
11 android:src="@drawable/ic_launcher" />
12
13 <TextView
14 android:id="@+id/userID"
15 android:layout_width="wrap_content"
16 android:layout_height="wrap_content"
17 android:text="用户ID" />
18
19 <com.example.listview.MyButton
20 android:id="@+id/button"
21 android:layout_width="wrap_content"
22 android:layout_height="wrap_content"
23 android:text="显示ID" />
24
25 </LinearLayout>

MianActivity就不贴出来了,他里面就一个 ListView

运行后的效果是:

当点击第三个按钮的时候,弹出对应的数字:

ListView中button点击事件盖掉onItemClick解决办法在:这里可以查看到

源码下载:下载

android ListView进阶

时间: 2025-01-13 11:56:56

android ListView进阶的相关文章

Android ListView 多种布局--进阶二

Android ListView 多种布局–进阶一 中提及了这么一个需求,本博文就这个需求的实现做进一步探讨. 前面是单列,后面是双列的情况,使用ListView实现,一般的解决思路是处理getView和getCount方法,如下实现: 首先实现Adapter,处理getView和getCount方法 public class DoubleAdapter extends BaseAdapter implements OnClickListener{ private List<String> m

android UI进阶之实现listview中checkbox的多选与记录

今天继续和大家分享涉及到listview的内容.在很多时候,我们会用到listview和checkbox配合来提供给用户一些选择操作.比如在一个清单页面,我们需要记录用户勾选了哪些条目.这个的实现并不太难,但是有很多朋友来问我如何实现,他们有遇到各种各样的问题,这里就一并写出来和大家一起分享. ListView的操作就一定会涉及到item和Adapter,我们还是先来实现这部分内容. 首先,写个item的xml布局,里面放置一个TextView和一个CheckBox.要注意的时候,这里我设置了C

android UI进阶之实现listview的分页加载

 分享了下拉刷新,这是一个用户体验非常好的操作方式.新浪微薄就是使用这种方式的典型. 还有个问题,当用户从网络上读取微薄的时候,如果一下子全部加载用户未读的微薄这将耗费比较长的时间,造成不好的用户体验,同时一屏的内容也不足以显示如此多的内容.这时候,我们就需要用到另一个功能,那就是listview的分页了.通过分页分次加载数据,用户看多少就去加载多少. 通常这也分为两种方式,一种是设置一个按钮,用户点击即加载.另一种是当用户滑动到底部时自动加载.今天我就和大家分享一下这个功能的实现. 首先,

Android高手进阶教程(十六)之---Android中万能的BaseAdapter(Spinner,ListView,GridView)的使用!

大家好!今天给大家讲解一下BaseAdapter(基础适配器)的用法,适配器的作用主要是用来给诸如(Spinner,ListView,GridView)来填充数据的.而(Spinner,ListView,GridView)都有自己的适配器(记起来麻烦).但是BaseAdapter(一招鲜)对他们来说却是通用的,为什么这么说呢,首先我们看一下API文档: 我们看一下BaseAdapter已经实现了ListAdapter和SpinnerAdapter的接口,而GridView的适配器是实现了List

Android高手进阶——Adapter深入理解与优化

Android高手进阶--Adapter深入理解与优化 通常是针对包括多个元素的View,如ListView,GridView.ExpandableListview,的时候我们是给其设置一个Adapter.Adapter是与View之间提供数据的桥梁,也是提供每一个Item的视图桥梁.   以ListView为例.其工作原理为: ● ListView针对List中每一个item, adapter都会调用一个getView的方法获得布局视图 ●我们通常会Inflate一个新的View,填充数据并返

Android高手进阶教程(二十八)之---Android ViewPager控件的使用(基于ViewPager的横向相册)!!!

分类: Android高手进阶 Android基础教程 2012-09-14 18:10 29759人阅读 评论(35) 收藏 举报 android相册layoutobjectclassloaderencoding 大家好,相信大家用的ListView控件一定很多的,是竖向滑动的,复用convertView,我们可以加载成千上万的数据,但有时候我们会有 这个需求比如相册,我们想横向滑动,并且数据有好多,这时候ViewPager控件就派上用场了,ViewPager使用时候我们需要导入第三方包 an

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复杂列表优化实践 很多社交App都不免会涉及到复杂的列表元素实现,一个列表上面可能大量的图片,不定长的评论列表,给手机端的程序员带来了不少的挑战.本文就是在实现复杂的列表滑动的情况下,利用已知的优化方法指导下的一次优化实践,旨在提升ListView的滑动流畅度,为用户带来良好的体验. 1:设计稿: 这是列表中可能出现的ItemView,有两种,但是又有许多相同的地方,比如一样有点赞的图片,评论等...其中,评论和点赞的数量是可变的. 2:使用一般布局带来的问