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);
		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();
	}

}

    效果圖:

wKiom1RtlymR16iTAASe_6MH0yw357.jpg



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章