《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();
}
}
效果图:
转载于:https://blog.51cto.com/wy521angel/1580129