项目中需要用到ListView的高亮选中,并且保持选中状态的功能。 走了不少弯路,总结一下。
展示一下ListView的选中需求, 选中,保持高亮。
需要注意几点:
1. adapter中的item所在的layout,不能设置背景,否则无法选中
2. item所在的UI中,不能出现抢占焦点的UI, 不然无法选中,如果存在,则需要去掉其focus相关的属性
<EditText
android:id="@+id/order_number_history"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="5dp"
android:enabled="true"
android:gravity="center"
android:inputType="number"
android:focusableInTouchMode="false" 这里
android:focusable="false" 这里
android:textColor="#000000" />
关键代码(根据选中的position,将背景颜色修改即可):
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Log.i("======", position + "");
ViewHolder mHolder = null;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.gv_orderhistory_item, null);
mHolder = new ViewHolder();
convertView.setTag(mHolder);
mHolder.tv_foodname_history = (TextView) convertView.findViewById(R.id.tv_foodname_history);
} else {
mHolder=(ViewHolder) convertView.getTag();
}
String or = list.get(position);
mHolder.tv_foodname_history.setText(or);
mHolder.index = position;
updateView(convertView);
return convertView;
}
private void updateView(View convertView)
{
ViewHolder mHolder = (ViewHolder) convertView.getTag();
int tagIdx = mHolder.index;
if (tagIdx != currentSelIdx)
{
convertView.setBackgroundResource(R.drawable.historyorder_lv_item_normal);
}
else
{
convertView.setBackgroundResource(R.drawable.historyorder_lv_item_selected);
}
}
private static class ViewHolder {
TextView tv_foodname_history; //菜名
int index;
}