前言:

  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)的更多相关文章

  1. 安卓开发----TextView控件属性列表(转)

    文章原地址: http://wwzcraig.blog.163.com/blog/static/64622969201373184343118/ android:autoLink设置是否当文本为URL ...

  2. 安卓开发树形控件之ExpandableListView(一)

    这个例子非常简单,简单到一个初学者都能随便开发出来,今天的目的仅仅只是为了将效果实现出来,如果想深入这里有几篇非常不错的博客: Android 之ExpandableListView几个特殊的属性 h ...

  3. PyQt学习随笔:QtDesigner ListView控件列表项的初始化

    在QtDesigner中设计的界面中添加ListView控件后,是没办法添加需要在ListView控件中显示的列表项.由于ListView控件只是一个展示列表项的视图控件,实现了界面与数据的分离,其要 ...

  4. ListView控件--2016年12月9日

    ListView属性 ListView   名称 说明 AccessKey 重写 WebControl.AccessKey 属性. 不支持将此属性设置 ListView 控件.(覆盖 WebContr ...

  5. WP8.1开发中ListView控件加载图列表的简单使用(1)

    我也是刚接触WP编程没几个月,就是在这段时间一直闲着没事,然后又比较喜欢WP这款系统,就学习了WP这方面的开发言语,自学是很困难的,掌握这方面的资料不多,很初级,就是自己在网上找资料学习过程中,看到别 ...

  6. ListView控件的列表项的文字不满一行的时候,如何实现点击该列表项的空白区域仍可触发列表项的点击事件

    今天在做Demo的过程中,使用到了ListView.然而在实现过程中,发现一个出现了一个问题:只能点击列表项的文字区域可以触发点击事件,而点击列表项的空白区域无法触发点击事件. 如下图: listit ...

  7. C#:ListView控件如何实现点击列表头进行排序?

    using System; using System.Collections; using System.Windows.Forms; namespace Common { /// <summa ...

  8. 跟我一起玩Win32开发(15):ListView控件

    这个控件其实不用阿拉来介绍,因为它太常见了,就好像我们一出门就会看到妹子一样常见.当然也可以说,它是对ListBox的扩充. 在使用该控件之前,我先介绍VS的一个相当好玩的功能. 在代码文件的#inc ...

  9. PyQt学习随笔:ListView控件删除一项列表项的方法

    ListView控件可以通过控件对应数据存储删除列表项,具体使用: 数据存储.removeRow(元素索引位置) 删除指定位置的一个列表项. 数据存储如果不知道程序定义的数据存储名,可以通过model ...

随机推荐

  1. k8s容器挂载配置文件

    1.新建ConfigMap apiVersion: v1 kind: ConfigMap metadata: name: test-conf namespace: default labels: na ...

  2. 安装memcache服务

    d:\tools\memcache\setup\memcached -d install

  3. UVa 11292 Dragon of Loowater (水题,排序)

    题意:有n个条龙,在雇佣勇士去杀,每个勇士能力值为x,只能杀死头的直径y小于或等于自己能力值的龙,只能被雇佣一次,并且你要给x赏金,求最少的赏金. 析:很简单么,很明显,能力值高的杀直径大的,低的杀直 ...

  4. qt编程遇到的东西

    setWindowFlags http://blog.chinaunix.net/uid-23500957-id-3876399.html move()方法,的作用是设置QWidget部件的pos坐标 ...

  5. 获取手机的唯一标示uuid

    NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];

  6. poj2462

    看八戒在做这个题,我也做了做.. 坑很多,还是要注意细节.不得不吐槽,难道又到了计算几何只能套模板否则就一串WA的情况了么! 要不是八戒做出来了,这题我估计我也就扔到这里了..哥不服啊~所以得做出来! ...

  7. java web前端easyui(layout+tree+双tabs)布局+树+2个选项卡tabs

    1.列出要实现的样式: 2.实现的代码: 分三大部分: 1):页面主体部分:mian.vm <html> <head> <title>Ks UI</title ...

  8. Date日期操作

    获取年月日时分秒: package com.util; import java.text.DateFormat; import java.util.Calendar; import java.util ...

  9. java keytool生成ssl加密密钥

    教程:http://www.cnblogs.com/getherBlog/p/3930317.html 其中用到几个命令: keytool -genkeypair -alias certificate ...

  10. python跳坑---生成器

    贵有恒,何必三更眠五更起,最无益,只怕一日曝十日寒. 好多东西要写下来一是方便自己,二可以分享给大家,我却一拖再拖. 工作的时候看别人代码中间结果,跳了个坑,关于python generator类型: ...