温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

ListView 的单选模式

发布时间:2020-06-03 18:46:59 来源:网络 阅读:4787 作者:wy521angel 栏目:移动开发

    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);	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();	// INVALID_POSITION 代表无效的位置。有效值的范围是 0 到当前适配器项目数减 1 。	if (ListView.INVALID_POSITION != select) {	Toast.makeText(RadioButtonListActivity.this,	"您选择的作家是:" + authors[select], Toast.LENGTH_SHORT)	.show();	} else {	// 如果用户开始没有选择	Toast.makeText(RadioButtonListActivity.this, "请选择一位作家!",	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();	} }

    效果图:

ListView 的单选模式



向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI