ListView 的单选模式

《RadioButton与ListView的混合使用》一文中,我在适配器中用标记的方法实现了用户选择的操作,这次用ListView的单选模式来实现一下。ListView的默认状态下是没有选择行为的,把ListView的choiceMode设置为singleChoice,列表就可以实现单选(当然它也有多选模式,这个后面再研究)。

Activity的布局文件如下,ListView选择了单选模式,这次我把ListView上方的TextView换成了Button:

<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" >

    <Button
        android:id="@+id/select"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="@string/select_authors"
        android:textSize="25sp" />

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:choiceMode="singleChoice" />

</LinearLayout>

ItemList的XML文件,RadioButton换成了CheckBox,另外, CheckBox 是可以获取焦点的UI控件,为实现ListView的点击,需要设置

“  android:clickable="false"

android:focusable="false"

android:focusableInTouchMode="false"”

这三项,其中,CheckBox的背景选用了自己做的一张图片,图片是RadioButton的样子:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:background="#fff" >

    <TextView
        android:id="@+id/author"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:padding="10dp"
        android:textSize="20sp" />

    <CheckBox
        android:id="@+id/radio"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_gravity="center_vertical"
        android:layout_marginRight="10dp"
        android:background="@drawable/radio_button_normal"
        android:button="@null"
        android:clickable="false"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:padding="10dp" />

</RelativeLayout>

Activity的代码如下,点击ListView的Item或者其上方的Button,都可以弹出Toast:

package com.example.choicelistviewtest;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;

public class RadioButtonListActivity extends Activity {

	private ListView radioButtonList;
	private RadioAdapter adapter;
	// 模拟几个数据,作为List的条目
	private String[] authors = { "芥川龙之介", "三岛由纪夫", "川端康成", "村上春树", "东野圭吾",
			"张爱玲", "金庸", "钱钟书", "老舍", "梁实秋", "亨利米勒", "海明威", "菲兹杰拉德", "凯鲁亚克",
			"杰克伦敦", "小仲马", "杜拉斯", "福楼拜", "雨果", "巴尔扎克", "莎士比亚", "劳伦斯", "毛姆",
			"柯南道尔", "笛福" };

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_choice_list_view_test);

		radioButtonList = (ListView) findViewById(R.id.list);
		adapter = new RadioAdapter(this, authors);
		radioButtonList.setAdapter(adapter);
		adapter.notifyDataSetChanged();
		radioButtonList.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {

				Toast.makeText(RadioButtonListActivity.this,
						"您选择的作家是:" + authors[arg2], Toast.LENGTH_SHORT).show();
			}
		});

		findViewById(R.id.select).setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				int select = radioButtonList.getCheckedItemPosition();
				if (ListView.INVALID_POSITION != select) {
					Toast.makeText(RadioButtonListActivity.this,
							"您选择的作家是:" + authors[select], Toast.LENGTH_SHORT)
							.show();
				}
			}
		});
	}
}

适配器:

package com.example.choicelistviewtest;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

public class RadioAdapter extends BaseAdapter {

	private String[] authors;
	private Context c;

	public RadioAdapter(Context c, String[] authors) {
		super();
		this.c = c;
		this.authors = authors;
	}

	@Override
	public int getCount() {
		return authors.length;
	}

	@Override
	public Object getItem(int arg0) {
		return null;
	}

	@Override
	public long getItemId(int arg0) {
		return 0;
	}

	@Override
	public View getView(int arg0, View arg1, ViewGroup arg2) {

		ChoiceListItemView choiceListItemView = new ChoiceListItemView(c, null);
		choiceListItemView.setName(authors[arg0]);
		return choiceListItemView;
	}

}

ListView是通过实现Checkable接口来处理单选模式的,这要求Item的视图实现Checkable接口,创建ChoiceListItemView类来实现该接口,ListView选中某个Item时,会调用ChoiceListItemView类的setChecked的方法:

package com.example.choicelistviewtest;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.CheckBox;
import android.widget.Checkable;
import android.widget.LinearLayout;
import android.widget.TextView;

public class ChoiceListItemView extends LinearLayout implements Checkable {

	private TextView nameTxt;
	private CheckBox selectBtn;
	public ChoiceListItemView(Context context, AttributeSet attrs) {
		super(context, attrs);

		LayoutInflater inflater = LayoutInflater.from(context);
		View v = inflater.inflate(R.layout.item_list, this, true);
		nameTxt = (TextView) v.findViewById(R.id.author);
		selectBtn = (CheckBox) v.findViewById(R.id.radio);
	}

	public void setName(String text) {
		nameTxt.setText(text);
	}

	@Override
	public boolean isChecked() {
		return selectBtn.isChecked();
	}

	@Override
	public void setChecked(boolean checked) {
		selectBtn.setChecked(checked);
		//根据是否选中来选择不同的背景图片
		if (checked) {
			selectBtn.setBackgroundResource(R.drawable.radio_button_checked);
		} else {
			selectBtn.setBackgroundResource(R.drawable.radio_button_normal);
		}
	}

	@Override
	public void toggle() {
		selectBtn.toggle();
	}

}

效果图:

时间: 11-20

ListView 的单选模式的相关文章

ListView多选和单选模式重新整理

超简单的单选和多选ListView 在开发过程中,我们经常会使用ListView去呈现列表数据,比如商品列表,通话记录,联系人列表等等,在一些情况下,我们还需要去选择其中的一些列表数据进行编辑.以前,我在项目开发中,都是在自定义的Adapter中去维护一个SparseBooleanArray变量来保存当前ListView中已经被选中的项,然后在自定义Adapter的getView()和ListView的setOnItemClickListener()方法中去实时更新SparseBooleanAr

本地数据下,radiobutton和图片组合,利用adapter+listview进行单选

浮生偷得半日闲,等接口定义的过程中,重新复习下adapter+listview实现单选的方法 主界面 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 andro

超简单的listview单选模式SingleMode(自定义listview item)

来源:https://stackoverflow.com/questions/8337180/custom-single-choice-listview/12823457#12823457 1.在listview item里面设置 <span style="font-size:18px;"><RadioButton android:id="@+id/radio1" android:checked="false" android:

iOS——UITableView单选模式,多选模式,单选多选混合模式

70行代码量的UITableViewCell实现单选,多选,单选多选混合选择. SingleVC——50行 MultipleVC——55行 ChaosVC——80行 cell为Xib拓展性较好,可拿去直接使用. 代码量不是越少越好,还要容易阅读,这里突出代码量的意思仅仅是建立在简单易用的原则上,有不明白可以跟帖,有大神优化的话跪求恩赐. github: https://github.com/ZyZwei/iOS_SelectStyle.git coding: https://git.coding

ListView单选的实现总结(转)

今天在智能停车场项目中需要实现PullToRefreshListView的单选功能,考虑到分页,刷新等,以前的实现方式是采用自己维护一个集合保存选中位置的选中状态,但这个方式比较繁琐,今天采用了listview的单选模式 listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);来实现: ListView是通过实现Checkable接口来处理单选模式的,这要求Item的视图实现Checkable接口,创建ChoiceListItemView类来实现该

ListView 的多选模式

昨天晚上熬粥,设定六个小时之后熬一个小时的,不知为什么后来变成一个小时之后熬了六个小时,今天早饭就只好改吃锅巴了. 在<ListView的单选模式>中,已经知道ListView有多选模式的,事实上我喜欢的作家也不只一个.ListView的多选模式起初写得比较简单,从中便发现了一些问题. 先看一下布局文件,几乎和先前没怎么变化,只是改掉了ListView的模式而已. <LinearLayout xmlns:android="http://schemas.android.com/a

ListView单选的实现总结

今天在智能停车场项目中需要实现PullToRefreshListView的单选功能,考虑到分页,刷新等,以前的实现方式是采用自己维护一个集合保存选中位置的选中状态,但这个方式比较繁琐,今天采用了listview的单选模式 listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);来实现: ListView是通过实现Checkable接口来处理单选模式的,这要求Item的视图实现Checkable接口,创建ChoiceListItemView类来实现该

Android中Activity处理返回结果的实现方式

大家在网上购物时都有这样一个体验,在确认订单选择收货人以及地址时,会跳转页面到我们存入网站内的所有收货信息(包含收货地址,收货人)的界面供我们选择,一旦我们点击其中某一条信息,则会自动跳转到订单提交界面,此时的收货信息已经变为我们之前选择的收件信息. 为了实现这个功能,Android提供了一个机制,跳转到其他activity时,再返回,可以接受到其他activity返回的值,无需再start新的当前activity:下面的示例中,创建两个activity,其中在MainActivity中提示输入

Android 编程之入门开发文件夹管理器开发详细讲解-1

在我们的手持设备中,一般都会自带设备公司自己开发的文件管理系统.拍照系统之类的东东,今天我给大伙说说入门级开发的文件夹管理器,代码贼少 总共就6个类吧,没有夹杂其他外部应用,就是一个纯文件夹管理器 APP主要功能设计:文件复制.文件夹复制.批量文件/文件夹复制.删除文件.删除文件夹.批量删除文件/文件夹.文件分类.文件搜索暂时没有写, 有兴趣的可以自己写写 APP主要应用:DrawerLayout .ListView.Fragment.IO.序列化.文件过滤.文件排序.ActionBar.Ada