這應該是大部分Android開發者在使用ListView時會碰到問題,在解決這個問題前,須要先了解什麼叫觸摸模式。html
觸摸模式(Touch Mode),在Android SDK的官方文檔中有詳細解釋(http://developer.android.com/resources/articles/touch-mode.html),其大概內容以下:java
package org.noodies; import android.app.Activity; import android.content.Context; import android.graphics.drawable.Drawable; import android.graphics.drawable.StateListDrawable; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Checkable; import android.widget.ListView; import android.widget.TextView; public class TestListActivity extends Activity { private ListView mListView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mListView = (ListView) findViewById(R.id.listView1); // 設爲單選,容許列表項切換checked/unchecked狀態 mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); // 列表的選擇效果設爲透明,由列表項自行維護各狀態顯示 mListView.setSelector(android.R.color.transparent); mListView.setAdapter(new TestAdapter()); } private class MyView extends TextView implements Checkable { private final int[] STATE_CHECKED = { android.R.attr.state_checked }; private int[] mSavedState; private boolean mChecked = false; public MyView(Context context) { super(context); } public void setChecked(boolean checked) { if (mChecked != checked) { mChecked = checked; updateBackground(); } } public boolean isChecked() { return mChecked; } public void toggle() { setChecked(!mChecked); } private void updateBackground() { Drawable bg = this.getBackground(); // 在這裏切換checked/unchecked狀態 if (bg.getClass().equals(StateListDrawable.class)) { if (isChecked()) { mSavedState = bg.getState(); bg.setState(STATE_CHECKED); } else if (mSavedState != null) { bg.setState(mSavedState); } } } } private class TestAdapter extends BaseAdapter { private String[] testData = { "test1", "test2", "abcd", "abcdefg" }; public int getCount() { return testData.length; } public Object getItem(int position) { return testData[position]; } public long getItemId(int position) { return 0; } public View getView(int position, View convertView, ViewGroup parent) { TextView v; if (convertView == null) { v = new MyView(TestListActivity.this); v.setBackgroundResource(R.drawable.list_item_bg); } else { v = (TextView) convertView; } v.setText(testData[position]); return v; } } }
須要創建一個selector做爲View的背景,包含選中狀態的圖像:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/list_item_bg_checked" android:state_checked="true"/> <item android:drawable="@drawable/list_item_bg_normal" android:state_pressed="false"/> <item android:drawable="@drawable/list_item_bg_pressed" android:state_pressed="true"/> </selector>