虽然在Android5.X中,RecyclerView在很多地方组件取代了ListView,但是ListView的使用依然是分广泛。

本博文将对以下两方面的内容进行介绍
1. ListView常用技巧
2. ListView常用拓展

具体代码请移步GitHub


ListView常用优化技巧

1. 使用ViewHolder模式提高效率

1. 使用ViewHolder模式提高效率
ViewHolder模式充分利用了ListView的视图缓存机制,避免了每次在getView()时重复的调用findViewById().
使用ViewHoder的步骤:
1. 在自定义的Adapter中定义一个内部类ViewHolder,并将Item布局中的控件作为成员变量
2. 接下来只要在getView()方法中通过视图缓存机制来重用以缓存即可。

public class MainMenuListAdapter extends BaseAdapter {private List<MainMenuListItemBean> mDataList;private Context mContext;private LayoutInflater mInflate;public MainMenuListAdapter(Context context, List<? extends Object> dataList) {this.mContext = context;this.mDataList = (List<MainMenuListItemBean>) dataList;this.mInflate = LayoutInflater.from(context);}//数据源中的数据对象个数@Overridepublic int getCount() {return mDataList.size();}//指定位置处的数据源对象@Overridepublic Object getItem(int position) {return mDataList.get(position);}//数据源对象的Id,如果有的话//如果数据源对象自己没有定义Id,则可以简单地返回其在数据源中的位置@Overridepublic long getItemId(int position) {return position;}//每当Android ListView需要显示一行时,它会调用此方法@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;//判断是否缓存if (convertView == null) {holder = new ViewHolder();// 通过LayoutInflater实例化布局convertView = mInflate.inflate(R.layout.activity_main_menu_list_item, null);//获取用于显示内容的控件的引用holder.idivpic = (ImageView) convertView.findViewById(R.id.id_iv_pic);holder.idtvcontent = (TextView) convertView.findViewById(R.id.id_tv_content);convertView.setTag(holder);} else {//通过tag找到缓存的布局holder = (ViewHolder) convertView.getTag();}//依据位置提取相应的数据源对象MainMenuListItemBean bean = mDataList.get(position);//设置显示内容holder.idivpic.setImageResource(R.drawable.flag_mark_blue);holder.idtvcontent.setText(bean.getContent());return convertView;}/*** 创建一个内部类ViewHolder保存控件。只加载View的时候使用findViewById()方法。* 使用View的setTag()方法保存ViewHolder。当convertView不为空的时候,直接取出来即可*/public class ViewHolder {public TextView idtvcontent;public ImageView idivpic;}}

2. 设置项目间分割符

2.设置项目间分隔线

ListView各个项目之间,可以通过设置分隔线来进行区分,系统提供了dividerdividerHeight这两个属性来帮我们实现这一功能。
通过这两个属性可以控制他们之间的分隔线和分隔线的高度。
当然,分隔线不仅仅可以设置为一个颜色,也可以设置为图片资源,分隔线的使用代码如下:

     android:divider="@android:color/holo_green_light"android:dividerHeight="3dp"

或者动态设置,必须先setDivider ,然后在setDiveiderHeight,否则不生效

  listView.setDivider(new ColorDrawable(Color.GREEN));listView.setDividerHeight(3);

原因:
源码如下

public void setDivider(Drawable divider) {  if (divider != null) {  mDividerHeight = divider.getIntrinsicHeight();  } else {  mDividerHeight = 0;  }  mDivider = divider;  mDividerIsOpaque = divider == null || divider.getOpacity() == PixelFormat.OPAQUE;  requestLayout();  invalidate();
}  

注意:

if (divider != null) {  mDividerHeight = divider.getIntrinsicHeight(); 
public int getIntrinsicHeight() {  return -1;
}  

如果想要将分隔线设置为透明:

listView.setDivider(null);
或者
android:divider=”@null”

  case 1:// 设置项目间分隔线LogUtils.d(position);// 设置分隔线 ,必须先setDivider,然后setivederHeightlistView.setDivider(new ColorDrawable(Color.GREEN));listView.setDividerHeight(3);// 取消分隔线// listView.setDivider(null);showInfo();break;

3. 隐藏ListView的滚动条

3.隐藏ListView的滚动条
默认的ListView在滚动时,在右边会显示滚动条,指定当前滚定的位置。我们可以通过scrollbars属性来控制ListView的滚动状态。特别的,当scrollbars设置为none时,ListView无论滚动还是不滚动,就都不会出现滚动条了。

 case 2:// 隐藏ListView的滚动条LogUtils.d(position);// false-一直都显示  true-不活动时隐藏,活动时显示//listView.setScrollbarFadingEnabled(true);//false 不活动的时候隐藏,活动的时候也隐藏  true-不活动时隐藏,活动时显示listView.setVerticalScrollBarEnabled(false);// 或者在xml中 android:scrollbars="none"  ---->  不活动的时候隐藏,活动的时候也隐藏showInfo();break;

4. 取消ListView的Item点击效果

4. 取消ListView的Item点击效果
当点击ListView的某一项Item时,系统默认会出现一个点击效果,在Android5.X上是一个波纹的效果,而在5.X以下是一个改变背景颜色的效果,但是我们可以通过修改listSelector属性来取消点击后的回馈效果。

android:listSelector="#00000000"

当然也可以是用Android系统自带的透明色来实现这个效果

 android:listSelector="@android:color/transparent"

或者在代码中

  listView.setSelector(new ColorDrawable(Color.TRANSPARENT));

5. 设置ListView需要显示在第几行

ListView以Item为单位进行显示,默认显示第一个Item,当需要指定具体的Item时,可以通过如下代码来实现

ListView.setSelection(N);

其中N就是要显示的第N个Item。

当然,这个方法类似于scrollTo,是瞬间完成的移动。

如果想实现平滑移动:

listView.smoothScrollBy(distance,duration);
listView.smoothScrollBy(offset);
listView.smoothScrollToPostion(index);

6. 动态修改ListView-notifyDataSetChanged

notifyDataSetChanged

mData.add("new");
notifyDataSetChanged();

当修改了传递给Adapter的映射List之后,只需要通过调用Adapter的notifyDataSetChanged方法,通知ListView更改数据源即可完成对ListView的动态修改。

注意:在使用mAdapter.notifyDataSetChanged方法时,必须保证传进Adapter的数据List是同一个List而不能是其他对象,否则将无法实现改效果。

NotifyTest.java


import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;import java.util.ArrayList;
import java.util.List;public class NotifyTest extends Activity {private List<String> mData;private ListView mListView;private NotifyAdapter mAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.notify);mData = new ArrayList<String>();for (int i = 0; i < 20; i++) {mData.add("" + i);}mListView = (ListView) findViewById(R.id.listView);mAdapter = new NotifyAdapter(this, mData);mListView.setAdapter(mAdapter);for (int i = 0; i < mListView.getChildCount(); i++) {View view = mListView.getChildAt(i);}}public void btnAdd(View view) {mData.add("new");mAdapter.notifyDataSetChanged();mListView.setSelection(mData.size() - 1);}
}

notify.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity"><ListView
        android:id="@+id/listView"android:layout_width="match_parent"android:layout_height="0dp"android:layout_alignParentStart="true"android:layout_alignParentTop="true"android:layout_weight="9"android:fastScrollEnabled="true" /><Button
        android:id="@+id/button"android:layout_width="match_parent"android:layout_height="0dp"android:layout_alignEnd="@+id/listView"android:layout_alignParentBottom="true"android:layout_alignParentStart="true"android:layout_weight="1"android:onClick="btnAdd"android:text="Add" />
</LinearLayout>

NotifyAdapter.java

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;public class NotifyAdapter extends BaseAdapter {private List<String> mData;private LayoutInflater mInflater;public NotifyAdapter(Context context, List<String> data) {this.mData = data;mInflater = LayoutInflater.from(context);}@Overridepublic int getCount() {return mData.size();}@Overridepublic Object getItem(int position) {return mData.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;// 判断是否缓存if (convertView == null) {holder = new ViewHolder();// 通过LayoutInflater实例化布局convertView = mInflater.inflate(R.layout.notify_item, null);holder.img = (ImageView) convertView.findViewById(R.id.imageView);holder.title = (TextView) convertView.findViewById(R.id.textView);convertView.setTag(holder);} else {// 通过tag找到缓存的布局holder = (ViewHolder) convertView.getTag();}// 设置布局中控件要显示的视图holder.img.setBackgroundResource(R.drawable.ic_launcher);holder.title.setText(mData.get(position));return convertView;}public final class ViewHolder {public ImageView img;public TextView title;}
}

notify_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="horizontal"><ImageView
        android:id="@+id/imageView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/ic_launcher" /><TextView
        android:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Large Text"android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>

7. 遍历ListView中所有的Item

ListView作为一个ViewGroup,为我们提供了操作子View的各种方法,最常见的就是通过getChildAt()来获取第i个子View,代码如下:

    for (int i = 0; i < mListView.getChildCount(); i++) {View view = mListView.getChildAt(i);}

ListView使用技巧-更新中相关推荐

  1. Android绘图机制与处理技巧-更新中

    概述 这里我们主要来探讨下 Android屏幕的相关只是 Android绘图技巧 Android图像处理技巧 SurfaceView的使用 绘图技巧中,医生讲的比较粗略,更多的细节参考了 Keegan ...

  2. linux常用命令技巧--更新中

    cp  –a  ojects  objects.ori    复制备份目录 cp –r  123  123             如果含有子目录一并复制             cp –p      ...

  3. 本专栏所有力扣题目的目录链接, 刷算法题目的顺序(由易到难/面试频率)/注意点/技巧, 以及思维导图源文件问题(持续更新中)

    这篇文章为本专栏所有力扣题目提供目录链接, 更加方便读者根据题型或面试频率进行阅读, 此外也会介绍我在刷题过程中总结的刷算法题目的顺序/注意点/技巧, 最后说下文中出现的思维导图源文件的问题 和 打卡 ...

  4. 【第十三届蓝桥杯备战】C/C++解题时的一些个人小技巧和注意事项(持续更新中)

    [第十三届蓝桥杯备战]C/C++解题时的一些个人小技巧和注意事项(持续更新中) 输入输出 数组 数据结构 1. 线段树 调试 References 先说一些废话:我最近觉得写算法题就像是打格斗游戏一样 ...

  5. tp5 使用技巧(持续更新中...)

    tp5 使用技巧(持续更新中...) 1.自动写入时间 create_time和update_time 使用save方法才行,insert方法不生效,不知为何 2.过滤字段 allowfield和st ...

  6. VS 常用的一些技巧和问题集锦【不断的更新中】

    我们在使用vs开发做开发的过程中经常会碰到这样那样的问题,经常是一些小问题,在此将我碰到的一些问题在这里总结一下,不断的更新中- VS左边工作区打开文档和右边资源管理器中选中文档不同步问题 解决办法: ...

  7. ListView动态数据源更新

    使用listView动态调用接口,更新数据源碰到几个坑,记录下: 使用httpclient调用url接口 public JSONObject getResultByUrl(String url) {H ...

  8. Android零基础入门第44节:ListView数据动态更新

    2019独角兽企业重金招聘Python工程师标准>>> 经过前面几期的学习,关于ListView的一些基本用法大概学的差不多了,但是你可能发现了,所有ListView里面要填充的数据 ...

  9. ListView使用技巧

    目录: ListView控件学习系列1-了解ListView控件 ListView控件学习系列2-编辑ListView ListView控件学习系列3-ListView选择,排序,分页 ListVie ...

最新文章

  1. Matplotlib基本用法
  2. VsCode中文乱码解决方法
  3. 剑指offer之用链表实现栈(带头节点)
  4. stixel world论文总结
  5. Go语言,在Ubuntu9.10和Windows安装
  6. 使用Memory DC
  7. Ubunut14.04安装wps最新方法
  8. windows API 菜鸟学习之路(四)
  9. centos7 nat模式配置静态ip_KUKA机器人-配置Ethernet/IP总线为Adaper模式
  10. 左右伸缩_OPPO概念机将至!横向卷轴+左右伸缩,你期待吗
  11. SQL数据去重复 Distinct 和 row_number() over()
  12. 10.27T1 堆贪心
  13. 在Mac OS X Lion上安装Ruby On Rails
  14. 用firework中合并图标的方法
  15. Android Studio 怎么连接MUMU模拟器并永久使用
  16. 计算机桌面的图片要点开才可以看,在桌面上的图片文件都不显示具体图片了 只能打开这个图片才能看到是哪张图片 请问怎么处理?...
  17. 概率算法中的Monte carlo算法
  18. 正常弹出移动硬盘与“写入缓存策略”
  19. 水平放滑轮组计算机械效率,初中物理中考常用公式-总结-2
  20. 第3章第32节:图形的应用:使用图形表达并列关系的内容 [PowerPoint精美幻灯片实战教程]

热门文章

  1. torch expand
  2. tomcat linux dump,Linux下Tomcat常用命令与配置
  3. thinkpad风扇声音大_笔记本风扇声音很大怎么解决
  4. rpgmaker mv修改_吴青峰版一点点MV 释出,唱作女帝陈珊妮执导
  5. 30. Leetcode 83. 删除排序链表中的重复元素 (链表-双指针)
  6. seaborn 笔记:load_dataset
  7. 主成分分析(Principal components analysis)
  8. 基于MATLAB的dijkstra算法及其应用
  9. ai作文批改_全球第一份机器人批改的作文 阿里AI批改中文试卷
  10. 当前订单不支持只花呗支付是什么意思_1、(跑腿介绍篇)支付宝花呗分期线下推广...