我有类似的问题,并通过代码解决它。它可能不是最聪明也不是最有效的解决方案,但是可以解决ListView绘图问题,并且迄今为止似乎运行良好。
活动文件:
private ListView listView;
private View selectedView;
private int selectedPosition;
private MyAdapter arrayAdapter;
...
// set a state machine for when a list item is clicked
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (selectedPosition == -1) {
// no item is selected, mark as selected
selectedView = view;
view.setBackgroundResource(R.drawable.bg_selected);
selectedPosition = position;
} else if (selectedPosition == position) {
// the same item is selected as the previous one, deselect
selectedView = null;
view.setBackgroundResource(R.drawable.bg_unselected);
selectedPosition = -1;
} else {
// another item is selected, deselect the previous and select the new one
selectedView.setBackgroundResource(R.drawable.bg_unselected);
selectedView = view;
view.setBackgroundResource(R.drawable.bg_selected);
selectedPosition = position;
}
arrayAdapter.setSelectedPosition(selectedPosition);
}
});
适配器代码:
public class MyAdapter extends ArrayAdapter<MyObject> {
private int selectedPosition;
private static class ViewHolder {
RelativeLayout layout;
...
}
public void setSelectedPosition(int selectedPosition) {
this.selectedPosition = selectedPosition;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_row, null);
holder = new ViewHolder();
holder.layout = (RelativeLayout) convertView.findViewById(R.id.rl_item);
...
convertView.setTag(holder);
}
else
holder = (ViewHolder) convertView.getTag();
...
if (position == selectedPosition)
holder.layout.setBackgroundResource(R.drawable.bg_selected);
else
holder.layout.setBackgroundResource(R.drawable.bg_unselected);
...
return convertView;
}
...
}
希望它能帮助!
你只是想让选择器图形显示在点击行上? (它不会如果行内的东西有自己的onClickListener) – FunkTheMonk
我认为android:listSelector的想法是处理列表选择(使用dpad在列表中移动),它不会影响已检查的行。 – aromero
@FunkTheMonk,即时通讯试图让列表中的项目“突出显示”或基本上改变点击后的背景颜色,但我只需要一次“检查”一个项目。 –