安卓开发——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-1128(数学问题,筛数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1128 思路:从0,开始,每次求一个数x的d(x),然后判断如果x没有标记,则说明x没有由任意一个d(i ...
- * 结束Activity
public class MainActivity extends Activity { @Override public void onCreate(Bundle sav ...
- js基础学习笔记(五)
多种选择(Switch语句) 当有很多种选项的时候,switch比if else使用更方便. 语法: switch(表达式) { case值1: 执行代码块 1 break; case值2: 执行代码 ...
- 自定义方法实现strcpy,strlen, strcat, strcmp函数,了解及实现原理
位置计算字符串长度 //strlen()函数,当遇到'\0'时,计算结束,'\0'不计入长度之内 //字符串的拷贝 //strcpy(字符串1,字符串2); //把字符串2 ...
- (转) MVC身份验证及权限管理-1
转自:http://blog.csdn.net/kenshincui/article/details/5559508 MVC自带的ActionFilter 在Asp.Net WebForm的中要做到身 ...
- day07(Set接口,HashSet类,hashcoad(),Collections工具类,Map集合)
Set接口 set接口的实现类特点 1.无序(取出来的顺序和存进去的数据的顺序不一致) 2.唯一(数据不能存相同的) 底层是用Map集合写的 HashSet类 实现了 set接口 唯一 ...
- (匹配)Fire Net --hdu --1045
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1045 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- JVM性能调优监控工具jps、jstack、jmap、jhat、jstat, hprof使用详解
JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps.jstack.jmap.jhat.jstat等小巧的工具,本博客希望能起抛砖引玉之用,让 ...
- Hdu2612 Find a way 2017-01-18 14:52 59人阅读 评论(0) 收藏
Find a way Time Limit : 3000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Su ...
- 【转】C#发送Email邮件
转自:http://hi.baidu.com/bluesky_cn/item/8bb060ace834c53f020a4df2 下面用到的邮件账号和密码都不是真实的,需要测试就换成自己的邮件账号. 需 ...