安卓开发——ListView控件(初始化ListView、列表刷新、长按添加menu)
前言:
ListView——列表,它作为一个非常重要的显示方式,不管是在Web中还是移动平台中,都是一个非常好的、不开或缺的展示信息的工具。在Android中,ListView控件接管了这一重担,在大量的场合下,我们都需要使用这个控件。虽然在Android 5.X时代,RecyclerView在很多地方都在逐渐取代ListView,但ListView的使用范围依然非常的广泛,它这万年老大哥的地位也不是轻易就能撼动的。下面就介绍一下ListView常用优化技巧。
使用ViewHolder模式提高效率
ViewHolder模式是提高ListView效率的一个很重要的方法。ViewHolder模式充分利用了ListView的视图缓存机制,避免了每次在调用getView()的时候都去通过findViewById()实例化控件。据测试,使用ViewHolder将提高50%以上的效率。使用ViewHolder模式来优化ListView非常简单,只需要在自定义Adapter中定义一个内部类ViewHolder,并将布局中的控件作为成员变量,代码如下所示。
public final class ViewHolder {
public ImageView img;
public TextView title;
}
接下来,只要在getView()方法中通过视图缓存机制来重用以缓存即可,完整的使用ViewHolder创建ListView Adapter的实例代码如下所示。
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView; import java.util.List; /*********************************************
* author: Blankj on 2016/7/23 15:39
* blog: http://blankj.com
* e-mail: blankj@qq.com
*********************************************/
public class ViewHolderAdapter extends BaseAdapter { private List<String> mData;
private LayoutInflater mInflater; public ViewHolderAdapter(Context context, List<String> data) {
this.mData = data;
mInflater = LayoutInflater.from(context);
} @Override
public int getCount() {
return mData.size();
} @Override
public Object getItem(int position) {
return mData.get(position);
} @Override
public long getItemId(int position) {
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
// 判断是否缓存
if (convertView == null) {
viewHolder = new ViewHolder();
// 通过LayoutInflater实例化布局
convertView = mInflater.inflate(R.layout.viewholder_item, null);
viewHolder.img = (ImageView) convertView.findViewById(R.id.imageView);
viewHolder.title = (TextView) convertView.findViewById(R.id.textView);
convertView.setTag(viewHolder);
}else {
// 通过tag找到缓存的布局
viewHolder = (ViewHolder) convertView.getTag();
}
// 设置布局中控件要显示的视图
viewHolder.img.setBackgroundResource(R.mipmap.ic_launcher);
viewHolder.title.setText(mData.get(position));
return convertView;
} public final class ViewHolder {
public ImageView img;
public TextView title;
}
}
ListView 初始化:
listView =(ListView)findViewById(R.id.cities_list);
adapter = new ArrayAdapter<String>(City_Column.this,android.R.layout.simple_list_item_1,cities);
listView.setAdapter(adapter);
//长按listView中的某个ITEM会弹出menu
this.registerForContextMenu(listView);
重载类中的方法,长按ListView中某个ITEM会有一个带两个 选择的menu,一个删除一个设置,效果如下:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("删除+设置");
menu.add(1,1,1,"删除");
menu.add(1,2,1,"设置");
} @Override
public boolean onContextItemSelected(MenuItem item) {
ContextMenu.ContextMenuInfo info = item.getMenuInfo();
AdapterView.AdapterContextMenuInfo contextMenuinfo = (AdapterView.AdapterContextMenuInfo)info;
int position = contextMenuinfo.position;
String city = cities.get(position); switch (item.getItemId()){
case 1: //点击删除后进行的操作
MainActivity.deleteCityThread deletecityThread = new MainActivity.deleteCityThread(city);
Thread threadDeleteCity = new Thread(deletecityThread);
threadDeleteCity.start();
Toast.makeText(City_Column.this,city+"is deltede",Toast.LENGTH_SHORT).show();
cities.remove(position);
adapter.notifyDataSetChanged();
//清除 删除城市下的 提醒
SharedPreferences shareDates = getSharedPreferences(city,MODE_PRIVATE);
SharedPreferences.Editor editorShareDates = shareDates.edit();
editorShareDates.clear();
break;
case 2: // 点击设置后进行的操作
Intent toRemindPage = new Intent(this,RemindPageActivity.class);
toRemindPage.putExtra("toRemindPage",city);
startActivity(toRemindPage);
break;
default:
break;
}
return super.onContextItemSelected(item);
}
ListView 的刷新:
上述代码中case 1: 进行删除操作会删掉ListView中的某个ITEM,然后刷新列表,操作如下: cities为adapter初始化的 数组
cities.remove(position);
adapter.notifyDataSetChanged();
ListView 加载的优化:
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1021/1815.html
安卓开发——ListView控件(初始化ListView、列表刷新、长按添加menu)的更多相关文章
- 安卓开发----TextView控件属性列表(转)
文章原地址: http://wwzcraig.blog.163.com/blog/static/64622969201373184343118/ android:autoLink设置是否当文本为URL ...
- 安卓开发树形控件之ExpandableListView(一)
这个例子非常简单,简单到一个初学者都能随便开发出来,今天的目的仅仅只是为了将效果实现出来,如果想深入这里有几篇非常不错的博客: Android 之ExpandableListView几个特殊的属性 h ...
- PyQt学习随笔:QtDesigner ListView控件列表项的初始化
在QtDesigner中设计的界面中添加ListView控件后,是没办法添加需要在ListView控件中显示的列表项.由于ListView控件只是一个展示列表项的视图控件,实现了界面与数据的分离,其要 ...
- ListView控件--2016年12月9日
ListView属性 ListView 名称 说明 AccessKey 重写 WebControl.AccessKey 属性. 不支持将此属性设置 ListView 控件.(覆盖 WebContr ...
- WP8.1开发中ListView控件加载图列表的简单使用(1)
我也是刚接触WP编程没几个月,就是在这段时间一直闲着没事,然后又比较喜欢WP这款系统,就学习了WP这方面的开发言语,自学是很困难的,掌握这方面的资料不多,很初级,就是自己在网上找资料学习过程中,看到别 ...
- ListView控件的列表项的文字不满一行的时候,如何实现点击该列表项的空白区域仍可触发列表项的点击事件
今天在做Demo的过程中,使用到了ListView.然而在实现过程中,发现一个出现了一个问题:只能点击列表项的文字区域可以触发点击事件,而点击列表项的空白区域无法触发点击事件. 如下图: listit ...
- C#:ListView控件如何实现点击列表头进行排序?
using System; using System.Collections; using System.Windows.Forms; namespace Common { /// <summa ...
- 跟我一起玩Win32开发(15):ListView控件
这个控件其实不用阿拉来介绍,因为它太常见了,就好像我们一出门就会看到妹子一样常见.当然也可以说,它是对ListBox的扩充. 在使用该控件之前,我先介绍VS的一个相当好玩的功能. 在代码文件的#inc ...
- PyQt学习随笔:ListView控件删除一项列表项的方法
ListView控件可以通过控件对应数据存储删除列表项,具体使用: 数据存储.removeRow(元素索引位置) 删除指定位置的一个列表项. 数据存储如果不知道程序定义的数据存储名,可以通过model ...
随机推荐
- hdu-1179(匈牙利算法)
题目链接: 思路:找n个巫师和m个魔棒匹配的问题,匈牙利算法模板 匈牙利算法:https://blog.csdn.net/sunny_hun/article/details/80627351 #inc ...
- Part 3 - Advanced Concepts(11-13)
https://simpleisbetterthancomplex.com/series/2017/09/18/a-complete-beginners-guide-to-django-part-3. ...
- C++/C头文件 .h和 .c
在C语言家族程序中,头文件被大量使用.一般而言,每个C++/C程序通常由头文件(header files)和定义文件(definition files)组成.头文件作为一种包含功能函数.数据接口声明的 ...
- Linux服务器部署系列之三—DNS篇
网上介绍DNS的知识很多,在这里我就不再讲述DNS原理及做名词解释了.本篇我们将以一个实例为例来讲述DNS的配置,实验环境如下: 域名:guoxuemin.cn, 子域:shenzhen.guoxue ...
- HDU 1716 排列2 (格式问题+排列)
题意:. 析:我们完全可以STL里面的函数next_permutation(),然后方便,又简单,这个题坑就是在格式上. 行末不能有空格,结尾不能有空行,不大好控制,必须控制好第一次数. 这个题本应该 ...
- html5获取经纬度
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Win7_Ultimate + VS2010 + openGL 配置
Win7_Ultimate + VS2010 + openGL 配置 0. 前言 OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性. (1)与C语言紧密结合. O ...
- PHP环境的搭建及与nginx的集成
1. 去php官网下载最新稳定版(最新其实是7.0,为了兼容性,使用5.6.16) wget http://cn2.php.net/get/php-5.6.16.tar.gz/from/this/m ...
- Python学习-27.Python中的列表(list)
列表已经用了很多次了.使用中括号包含元素. list = ['a','b','c'] 获取元素使用[]. print(list[0]) 输出a 不过值得注意的是,[]只能是0到元素个数-1吗?在Pyt ...
- CUDA开发 - CUDA 版本
"CUDA runtime is insufficient with CUDA driver"CUDA 9.2: 396.xx CUDA 9.1: 387.xx CUDA 9.0: ...