之前写过一篇关于listview的博客,现在感觉那篇博客关于listview认识不够全面。但有些方法还是可取,例如灵活的监听,写适配器。链接在这里android listview长按,单击各种事件捕捉。那个单击监听是一项项设置监听,效率也不好。

不断工作的过程,也是不断总结过程。现在对于listview有了更透彻的理解,所以重新写了一个实践demo。这个demo有涉及到listview的数据源,布局,适配器以及各种监听、效率的提升。现在对于这些理解,想写出一个通用的适配器,但发现还是有点困难,就是数据源问题,还有布局。但是写成通用适配器也是可以,用继承方法。凡是关于listview的数据源以及布局实现实现就用函数调用,然后继承后重写这些方法就可以了。因为我在公司项目也是这样,效果还不错。下面来讲解一下listview。

一、实体类ItemTest

这是一个定制listview,所以写一个实体类作为listview适配器的适配类型。

package com.example.customlistviewdemo;/** * 实体类 ItemTest * @author mmsx * 博主博客网址: http://blog.csdn.net/qq_16064871 */public class ItemTest {private int mImageViewID;private String mstrName;public ItemTest(){}public ItemTest(int ImageViewID, String strName) {this.mImageViewID = ImageViewID;this.mstrName = strName;}public int getImageViewID() {return mImageViewID;}public String getstrName() {return mstrName;}}
二、listview的对于实体类ItemTest的适配器SelfAdapt

listview 适配器 继承自BaseAdapter,通过SelfAdapt的构造函数传入activity的生命周期、listview的布局、以及数据源。

在里面用了判断convertView是否为空,来减少加载布局,提升效率。

还有用了一个内部类ViewHolder来减少查找布局里面的id,用标签方式缓存convertView.setTag(viewHolder);,然后取出来viewHolder = (ViewHolder) convertView.getTag();

这样做listview效率就有很不错效果了。

package com.example.customlistviewdemo;import java.util.ArrayList;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.CheckBox;import android.widget.CompoundButton;import android.widget.Toast;import android.widget.CompoundButton.OnCheckedChangeListener;import android.widget.ImageView;import android.widget.TextView;/** * listview 适配器 继承自BaseAdapter * @author mmsx * 博主博客网址: http://blog.csdn.net/qq_16064871 */public class SelfAdapt extends BaseAdapter implements OnCheckedChangeListener{private Context mContext;private int mresourceLayoutID;private LayoutInflater mLayoutInflater;private ArrayList mList;/** * 适配器的构造函数 * @param context * @param resourceLayoutID * @param list */public SelfAdapt(Context context, int resourceLayoutID ,ArrayList list){this.mContext = context;this.mresourceLayoutID = resourceLayoutID;this.mList = list;//取得xml里定义的view,并且实例化mLayoutInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}@Overridepublic int getCount() {return mList != null ? mList.size() : 0;}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder = null;if (convertView == null) {//这样写不用每次都加载布局,以及查找id,提高listview的效率convertView = mLayoutInflater.inflate(mresourceLayoutID, null);viewHolder = new ViewHolder();viewHolder.imageView = (ImageView)convertView.findViewById(R.id.imageView1);viewHolder.textView = (TextView)convertView.findViewById(R.id.textViewTest);viewHolder.checkbox = (CheckBox)convertView.findViewById(R.id.checkBox1);//标签加入TagconvertView.setTag(viewHolder);}else {//当convertView不为空是,从标签ViewHolder取出viewHolder = (ViewHolder) convertView.getTag();   }ItemTest itemTest = new ItemTest();itemTest = mList.get(position);viewHolder.imageView.setImageResource(itemTest.getImageViewID());viewHolder.textView.setText(itemTest.getstrName());//设置checkbox的监听viewHolder.checkbox.setOnCheckedChangeListener(this);viewHolder.checkbox.setTag(position);return convertView;}//内部类实现,提升listview效率 class ViewHolder {public ImageView imageView;public TextView textView;public CheckBox checkbox;}@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {int nPosition = ((Integer) buttonView.getTag()).intValue();Toast.makeText(mContext, String.valueOf(nPosition) + " CheckBox 的点击" + String.valueOf(isChecked), Toast.LENGTH_SHORT).show();}}
三、MainActivity

在这里面设置了listview单击,长按的接口监听。

listView.setOnItemClickListener(this);    //设置单击监听,接口实现listView.setOnItemLongClickListener(this);  //设置长按监听,接口实现

设置这两个要进行接口

implements OnItemClickListener,OnItemLongClickListener
下面看全部代码

package com.example.customlistviewdemo;import java.util.ArrayList;import android.os.Bundle;import android.app.Activity;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemLongClickListener;import android.widget.ListView;import android.widget.AdapterView.OnItemClickListener;import android.widget.Toast;/** * listview 比较标准写法,以及提升listview效率 * @author mmsx * 博主博客网址: http://blog.csdn.net/qq_16064871 */public class MainActivity extends Activity implements OnItemClickListener,OnItemLongClickListener{private ArrayList mArrayList = new ArrayList();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);InitUI();}private void InitUI() {if (mArrayList != null) {mArrayList.clear();for (int i = 0; i < 50; i++) {ItemTest itemTest1 = new ItemTest(R.drawable.bmp1,"图片一");mArrayList.add(itemTest1);ItemTest itemTest2 = new ItemTest(R.drawable.bmp2,"图片二");mArrayList.add(itemTest2);}}ListView listView = (ListView)findViewById(R.id.listView1);SelfAdapt selfAdapt = new SelfAdapt(getApplicationContext(), R.layout.listview_item ,mArrayList);listView.setAdapter(selfAdapt);listView.setOnItemClickListener(this);    //设置单击监听,接口实现listView.setOnItemLongClickListener(this);  //设置长按监听,接口实现}@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {Toast.makeText(this, "listview 的点击" + parent.getItemAtPosition(position), Toast.LENGTH_SHORT).show();}@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view,int position, long id) {Toast.makeText(this, "listview 的长按", Toast.LENGTH_SHORT).show();return true;}}
四、listview的布局listview_item

是要实现实体类ItemTest,我格外增加了chexbox控件监听,示例一下实现。

其中这句话有时很重要    android:descendantFocusability="blocksDescendants"

如果你的自定义ListViewItem中有Button或者Checkable的子类控件的话,那么默认focus是交给了子控件。所以需要加上这一句。

<?xml version="1.0" encoding="utf-8"?>            
五、activity_main

        
六、实现的效果图



另外我还在收集listview各种小知识,例如分隔线,点击不要默认效果,listview不滚动用滚动条等,后期会独自写一篇博客。
项目资源下载:
转载请注明出处的博客网址: http://blog.csdn.net/qq_16064871
如有转载未注明出处博客网址,或者没有得到作者的同意。作者持有版权所有权。

更多相关文章

  1. [置顶] android listview 连续调用 getview问题分析及解决。
  2. android 事件机制与事件监听(一)
  3. Android沉浸式状态栏(透明状态栏)最佳实现
  4. Activity的构成
  5. Android(安卓)RecyclerView 的 网格布局 ItemDecoration
  6. Android学习系列(5)--App布局初探之简单模型
  7. 仿微信、短信、QQ等消息数目右上角红色小圆球气泡显示(基于Androi
  8. Android(安卓)沉浸式状态栏原理
  9. 关于android的各种花式键盘问题

随机推荐

  1. 七个简单但棘手的 JS 面试问题[每日前端
  2. 一不小心又把应用发挂了,复盘一下这十几分
  3. 设计模式的六大原则
  4. JavaScript 解构的5个有趣用法[每日前端
  5. MYSQL常用命令(1)
  6. CentOS8 autofs自动挂载服务
  7. MYSQL常用命令(2)
  8. 最近,大厂前端面试都问些什么问题
  9. React VS Vue:2020年应该选哪个?[每日前端
  10. 每日学习-ansible replace模块