这应该是大部分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>