Android开发之ListView使用经验分享

简介: 在Android开发中,ListView是使用最广泛的组件之一,虽然谷歌推出了RecycleView,但是很多项目中依旧在使用ListView,本文将总结一下使用过程中遇到的一些问题,与大家共勉~~~一、ListView 与 AdapterList...

在Android开发中,ListView是使用最广泛的组件之一,虽然谷歌推出了RecycleView,但是很多项目中依旧在使用ListView,本文将总结一下使用过程中遇到的一些问题,与大家共勉~~~

一、ListView 与 Adapter

ListVeiw本身是一个容器组件,需要通过Adapter来完成数据的显示,即通过setAdapter方法完成,而这个方法的参数是ListAdapter接口的对象,如 ArrayAdapter, CursorAdapter, SimpleAdapter,其中ArrayAdapter只适用于数组操作,对于复杂的效果无法实现

二、SimpleAdapter

主要功能是将List集合的数据转换成ListView可以支持的数据,其构造函数如下

SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
AI 代码解读

参数含义:

context:关联SimpleAdapter运行着的视图的上下文。
resource: 参数值指定的布局就是ListView中每一个列表项 。
data: 参数就是要加载到ListView中的数据。
(假设每一个列表项所对应的布局文件中包含了两个组件:TextView和EditText,id分别为textview和edittext。 那么在加载列表项时,需要通过组件的id和data参数中List元素中的Map对象对应)
from: 参数是Map对象的key
to :表示组件的id
(假设from = new String[]{"userId", "userName"},to = new int[]{R.id.userId,R.id.userName}。意思是将Map对象中key为userId 的value绑定到 R.id.userId上,userName的value绑定到 R.id.userName上)
AI 代码解读
三、android ListView几个比较特别的属性
1、stackFromBottom属性,设置该属性为true之后你做好的列表就会显示到最下面

2、cacheColorHint属性,很多人希望能够改变一下它的背景,使他能够符合整体的UI设计,改变背景背很简单只需要准备一张图片然后指定属性 android:background="@drawable/bg",不过不要高兴地太早,当你这么做以后,发现背景是变了,但是当你拖动,或者点击list空白位置的时候发现ListItem都变成黑色的了,破坏了整体效果。如果你只是换背景的颜色的话,可以直接指定android:cacheColorHint为你所要的颜色,如果你是用图片做背景的话,那也只要将android:cacheColorHint指定为透明(#00000000)就可以了
android:cacheColorHint="@android:color/transparent"

3、divider属性,该属性作用是每一项之间需要设置一个图片做为间隔,或是去掉item之间的分割线
android:divider="@drawable/list_driver",其中  @drawable/list_driver 是一个图片资源,如果不想显示分割线,只要设置为android:divider="@drawable/@null" 就可以了

4、fadingEdge属性,上边和下边有黑色的阴影时设置 android:fadingEdge="none" 设置后没有阴影了

5、scrollbars属性,作用是隐藏listView的滚动条,android:scrollbars="none"

6、fadeScrollbars属性,android:fadeScrollbars="true" 时可以实现滚动条的自动隐藏和显示。
AI 代码解读
四、如何获取ListView中单击某个item后的信息,onItemClick函数如下:
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
AI 代码解读

举例:X, Y是两个listview,X里有1,2,3,4这4个item,Y里有a,b,c,d这4个item。如果你点了b这个item。如下:

AdapterView<?> parent   // parent相当于listview  Y适配器的一个指针,可以通过它来获得Y里装着的一切东西
View view    // view是你点b item的view的句柄,就是你可以用这个view,来获得b里的控件的id后操作控件
int position   // positionbY适配器里的位置
long id    // id是b在listview Y里的第几行的位置,大部分时候position和id的值是一样的
AI 代码解读
注意:

在点击事件中,经常遇到的一个坑是:ListView不能响应onItemClick事件
发生原因:当listview中包含button,checkbox等控件的时候,android会默认将focus给了这些控件,
也就是说listview的item根本就获取不到focus,所以导致onitemclick事件不能触发。
解决办法:在Item布局的根布局加上android:descendantFocusability="blocksDescendants"

五、ScrollView嵌套ListView只显示一行的问题

解决方案:重写ListView类的onMeasure方法(该方法同样适用于嵌套GridView)

public class MyListView extends ListView
{
   private boolean haveScrollbar = true;
   public MyListView(Context context, AttributeSet attrs, int defStyle)
   {
      super(context, attrs, defStyle);
   } 
   public MyListView(Context context, AttributeSet attrs)
   {
      super(context, attrs);
   } 
   public MyListView(Context context)
   {
      super(context);
   }
   /**
    * 设置是否有ScrollBar,当要在ScollView中显示时,应当设置为false。默认为 true
    *
    * @param haveScrollbars
    */
   publicvoid setHaveScrollbar(boolean haveScrollbar)
   {
      this.haveScrollbar = haveScrollbar;
   }
   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
   {
      if (haveScrollbar == false)
      {
        // 根据模式计算每个child的高度和宽度
        int expandSpec = MeasureSpec.makeMeasureSpec(
              Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
      }
      else
      {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
      }
   } 
}
AI 代码解读
六、继承ListActivity完成ListView显示

如果java类继承了ListActivity,那么表明该类只能存在一个ListView控件,可以通过getListView()方法取得默认的控件,但是在相应的xml文件中,定义的ListView必须指明固定的id,android:id="@android:id/list"

七、Header 和 Footer(一个ListView只有一个)

通过ListView的addHeaderView();和addFooterView();方法可以添加列表的头部和尾部,但是注意:

1、head和footer是listview的列表项,如果你有一个head的话,那么他的position就是0

2、在使用header和footer的过程中,如果需要动态的显示和隐藏header和footer的话,如果直接设置GONE,虽然元素隐藏了,但是还是占用着那个区域。此时需要给footer再加上一个layout或者是父级的view才可以,如下所示:

ListView listView = new ListView(context); 
TextView footer = new TextView(context);
LinearLayout footerParent = new LinearLayout(context); 
footerParent.addView(footer);
listView.addFooterView(footerParent); 
footer.setVisibility(View.GONE);
AI 代码解读

3、如何设置head和footer不可点击

public void addHeaderView (View v, Object data, boolean isSelectable)
public void addFooterView (View v, Object data, boolean isSelectable)
AI 代码解读

将第三个参数设置为flase即可

八、去除或替换listview 默认的点击选中时的颜色

1、去除默认的点击选中时的颜色

  • 设置列表layout的backgroudcolor属性就OK了。
  • 设置
android:focusable="false" 
android:focusableInTouchMode="false"
android:cacheColorHint="#00000000" 
android:listSelector="#00000000"
AI 代码解读

2、替换listview 默认的点击选中时的颜色
设置listivew的listSelector属性就可以了,如果要求点击变色,松开以后恢复,则需要用为该属性指定一个xml文件,里面设置selector,为按下和松开设置颜色。

九、获取ListView中某个Item中Button,并为其设置click事件

很多朋友喜欢继承BaseAdapter适合器进行处理,其实直接继承SimpleAdapter重写getView方法进行处理即可

public View getView(int position, View convertView, ViewGroup parent) {
   View view = super.getView(position, convertView, parent);
   Button btn = (Button) v.findViewById(R.id.btn);
   //给当前的按钮设置Tag,方便知道点击的是哪一个item的按钮
   btn.setTag(position);
   btn.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
          Toast.makeText(mContext, "您点击了" + v.getTag(), Toast.LENGTH_LONG).show();
       }
    });
   return view;
}
AI 代码解读
目录
打赏
0
0
0
0
3
分享
相关文章
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
319 76
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
91 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
232 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
78 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
194 12
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
escrcpy 是一款基于 Scrcpy 的开源项目,使用 Electron 构建,提供图形化界面来显示和控制 Android 设备。它支持 USB 和 Wi-Fi 连接,帧率可达 30-120fps,延迟低至 35-70ms,启动迅速且画质清晰。escrcpy 拥有丰富的功能,包括自动化任务、多设备管理、反向网络共享、批量操作等,无需注册账号或广告干扰。适用于游戏直播、办公协作和教育演示等多种场景,是一款轻量级、高性能的 Android 控制工具。
142 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
80 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
100 19
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
147 14
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
226 3
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等