Android ListView 默认选中某一项

这里是使用 TOC 生成的目录:

  • Layout文件定义

    • ListView定义
    • item 模板定义
  • 代码
    • 初始化列表
    • 用户点击处理
  • 效果


要使用 ListView 实现一个充值方式选择,默认想选中第二项,搞了一下午,终于搞定了。原本就没怎么用 Java 写过 Android 应用,又隔了好久没写,一切都生疏了,半吊子变成大呆瓜了……

Layout文件定义

分两部分,一部分是 ListView 的定义,一部分 item 模板,即 row 的定义。

ListView定义

说起来也很简单,下面是 Layout 文件中的 ListView 定义:

    <ListView
        android:id="@+id/recharge_method_list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="6dp"
        android:dividerHeight="2dp"
        android:divider="@color/ssq_bkgnd"
        android:background="@android:color/white"
        android:choiceMode="singleChoice"
        android:listSelector="@null"
        >
    </ListView>

嘿,别说,CSDN的Markdown编辑器比原来的默认编辑器好用多了,插入代码更简单了。这是第一次使用CSDN的Markdown,赞一个。

item 模板定义

item模板如下定义:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:gravity="center_vertical"
    android:background="@drawable/option_selector"
    >
    <ImageView
        android:id="@+id/recharge_method_icon"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="4dp"
        />
    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical"
        >
        <TextView
            android:id="@+id/recharge_method_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="15sp"
            />
        <TextView
            android:id="@+id/recharge_method_clue"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="12sp"
            />
    </LinearLayout>
    <ImageView
        android:id="@+id/recharge_method_checked"
        android:layout_width="34dp"
        android:layout_height="28dp"
        android:layout_marginRight="16dp"
        android:src="@drawable/option_checked"
        android:visibility="invisible"
        />
</LinearLayout>

我为了给一个 ListView 的 item 显示一个选择图标,在定义 item 模板文件时直接加了一个 ImageView ,通过控制它的显示和隐藏来达到看起来选中的效果。偷了个懒,这是比较简单的实现,在 ListView 中 item 数量不多时对内存、性能等影响不大。

代码

代码比较简单,分两部分来看吧,一部分是初始化列表,一部分是用户点击列表中的某项后切换选中标记。

初始化列表

initRechargeList()方法用来初始化充值方式列表,代码如下:

    private void initRechargeList(){
        actionTexts = new String[]{
                getString(R.string.recharge_unionpay), getString(R.string.recharge_alipay), getString(R.string.recharge_bestpay)
        };
        actionClue = new String[]{
                getString(R.string.recharge_unionpay_clue), getString(R.string.recharge_alipay_clue), getString(R.string.recharge_bestpay_clue)
        };
        actionImages = new int[]{
                R.drawable.unionpay,
                R.drawable.recharge_icon_alipay,
                R.drawable.recharge_icon_bestpay
        };
        actionList = (ListView)findViewById(R.id.recharge_method_list);
        actionItems = new ArrayList<HashMap<String, Object>>();
        actionAdapter = new SimpleAdapter(this, actionItems, R.layout.recharge_method_list_item,
                new String[]{"action_icon", "action_name", "action_clue"},
                new int[]{R.id.recharge_method_icon, R.id.recharge_method_name, R.id.recharge_method_clue});

        for(int i = 0; i < actionImages.length; ++i) {
            HashMap<String, Object> item = new HashMap<String, Object>();
            item.put("action_icon", actionImages[i]);
            item.put("action_name", actionTexts[i]);
            item.put("action_clue", actionClue[i]);
            actionItems.add(item);
        }
        actionList.setAdapter(actionAdapter);
        actionList.setOnItemClickListener(itemListener);
        actionList.post(new Runnable() {
            @Override
            public void run() {
                lastCheckedOption = actionList.getChildAt(1).findViewById(R.id.recharge_method_checked);
                lastCheckedOption.setVisibility(View.VISIBLE);
                actionList.setItemChecked(1, true);
            }
        });
    }

上面的代码是初始化充值方式列表。 ListView 的用法也比较简单,View–Row Template–Data–Adapter,四个要素。

我遇到的问题是:如何默认选中某一项。

实际上我的列表中只有三项,不用考虑哪一项会不可见,应该在安卓手机上都是可见的。

一开始我在调用了 ListView 的 setAdapter 方法后,直接使用 getChildAt(1) 来获取第二项对应的 View ,你猜到了,没错,崩溃了: NullPointerException 。空指针啊,用 C++ 时的老情人,改用 Java 写 Android 了,她又跑来和我约会了。

搞了半天,我才弄明白: setAdapter() 其实是异步的 ,调用了这个方法, ListView 的 item 并没有立马创建,而是在下一轮消息处理时才创建。弄明白了这个,就有了前面代码中的解决办法:使用 post() 提交一个 Runnable() 对象,在 Runnable() 内部来做默认选中这种初始化动作

如你所见,我 new 了一个 Runnable 给 post() 方法,在 run() 内找到了第 2 项,显示了选中图标;并且我把第 2 项对应的 View 保存到 lastCheckedOption 成员变量中。后面我们会通过 lastCheckedOption 这个变量,结合 OnItemClickListener 来实现 ListView 中三个 item 的互斥选择效果。

Markdown怎么给每个段落前加缩进呢……迷惑中……四个空格就给本段落打上背景色了,挺好……

用户点击处理

点击处理是通过 AdapterView.OnItemClickedListener 接口完成的。代码如下:

    private AdapterView.OnItemClickListener itemListener = new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if(lastCheckedOption != null){
                lastCheckedOption.setVisibility(View.INVISIBLE);
            }
            lastCheckedOption = view.findViewById(R.id.recharge_method_checked);
            lastCheckedOption.setVisibility(View.VISIBLE);
        }
    };

如你所见,我通过 lastCheckedOption 变量保存了上次选中的 item 中的表示选中效果的图标,用户点击某一个时,先隐藏上一个 item 的选中图标,再显示当前的,就有了貌似互斥的效果了。

一切就这么简单,搞定了。

效果

最终的效果是酱紫的:

嗳,插入图片比原来的非 Markdown 编辑器好用多了。



好啦,想不到我又来写 Android 应用了,感觉很 High 啊。



还不知道 Markdown 版本的编辑器写出来的博客,发表出来肿么样呢,生成了个目录,直接 TOC 就 OK 了,还是很方便的。写完了,还是没搞明白段落的行首缩进如何搞呢。

据说还支持离线编辑,赞。

还有一点:左右分栏,可以看到效果,比 github 的 wiki 页面编辑要强一点。

时间: 2024-12-10 03:48:30

Android ListView 默认选中某一项的相关文章

[转]Ext ComboBox 默认选中某一项

原文地址:http://blog.csdn.net/liuguxing/article/details/8623190 [javascript] view plain copy 项目中经常用到选择框,需要从后台异步加载数据,可单独写一个组件进行加载 [javascript] view plain copy App.ComboBox = function(combo){ var comboBox = new Ext.form.ComboBox({ store:new Ext.data.JsonSt

js 默认选中分页条件项

1 <table border="0" cellspacing="0" cellpadding="0" height="100%" align="left"> 2 <tr valign=bottom> 3 <td></td> 4 <td><select id="viewType" name="viewType&q

ng1 select 默认选中第X项并且不会出现空白列的实现方式

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body ng-app="app" ng-controller="ctrl"> <h1>试试下拉</h1> <s

Android ListView 列表项点击之后,保持背景颜色

项目中突然遇到这样的问题,一些消息类的界面,需要使用listview进行显示,正常的需求是刚开始进入消息显示界面的时候,列表项显示的都是全黑的,接着点击了某一个列表项之后,就要更换成白色,并且保持白色的显示,剩下的仍旧为黑色的,一开始就有点走进了死胡同,使用selector结合shape来定义选中.未选中.点击或者点击之后的背景显示,实例如下: </pre><p></p><pre name="code" class="html&quo

关于android ListView的默认选择操作

在android开发中,ListView应该说是最常用的组件之一.这篇文章不对它的基本应用做讲解,需要了解相关内容的同行,敬请自行问度娘. 实际中,ListView初始化后,要进行一些默认操作,比如,我有个布局是显示部门与下属人员,要求加载完部门列表后,在右边显示第一个部门的下属人员,同时标识当前选中部门(红色符号).(如下图) 从度娘可以看出来,有这个类似需求的同行在不少数,但是,要么是把解决办法笼统地带过,要么是很复杂的分析和解决方法. 对于大部分人来说,其实直接给出解决办法,是更好的答案.

Dojo Tree设置默认选中项并且获得它

在使用CSS3的中有如下类似代码 Html代码 @media screen and (max-width:480px){ -- } 意思是在最大宽度为480px的设备上应用{}里面的样式.这里的width,注意是手机浏览器的分辨率,而不是手机设备的屏幕分辨率.比如苹果4的手机屏幕分辨率是960x640.而其自带的Safari浏览器的分辨率是320*480.我们可以通过如下代码检测所用的浏览器的分辨率: Js代码 $("#info").html("(您的浏览器的分辨率为:&qu

getresources()与Spinner取消默认选中第一项

getResource() getResource是在有context的前提下才能使用,在android中常在activity中使用它.普通的类一般无法使用.否则会报空指针异常. Spinner默认选中第一项 取消默认选中第一项的方法: spinner.setSelection(0, true); 注意:

android listview级联三菜单选择地区,本地数据库sqlite级联地区,item选中不变色

前言:因为找了N多网上的资源都没有好的解决方案,别人都是只给思路没给具体源码,真TMD纠结,干嘛求别人,自己动手才是真,最痛恨那些所谓大牛的作风,给了点点代码就让别人去想,你让我们这种小白情何于堪!!!!!!此例是基于listview来实现本地sqlite实现的! 二话不说,程序猿求的是有图有真相有源码!大家下载后有什么问题可以找到本人:QQ508181017 核心代码如下 1.数据库操作类 package com.icq.demo.db; import java.util.ArrayList;

android RadioGroup实现单选以及默认选中

本文将通过radiogroup和radiobutton实现组内信息的单选, 其中radiogroup就是将radiobutton进行分组,同一管理和控制 同时实现默认选中情况,获取默认值.效果图 具体实例如下: 1.activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.co