Android编程心得-ListView的Item高亮显示的办法
在我们使用ListView的时候,经常会遇到某一项(Item)需要高亮显示的情况,如下图,有人说当我们点击子项的时候会变亮,但有时候业务逻辑需要让ITEM根据条件自动变亮,下面我来介绍一下我自己的解决办法
1.首先在layout文件夹对应的xml配置文件定义一个listView控件,这里我不做详细介绍了
<ListView android:id="@+id/MeterReadingList" android:layout_width="fill_parent" android:layout_height="fill_parent" android:divider="@color/gray" android:dividerHeight="1dp" > </ListView>
2.自定义的适配器MyCustomAdapter 用来继承BaseAdapter ,注意最后的setSelectItem方法是关键
public class MyCustomAdapter extends BaseAdapter { private LayoutInflater customInflater; private List<ReadyTask> list; private int layoutID; public class ViewHolder { TextView m_order; TextView m_MeterID; TextView m_RFID; TextView m_Area; TextView m_clientName; TextView m_clientAddress; } public MyCustomAdapter(LayoutInflater customInflater, List<ReadyTask> list, int layoutID) { this.customInflater =customInflater; this.list = list; this.layoutID = layoutID; } @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return list.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub final ReadyTask rTask = (ReadyTask)getItem(position); ViewHolder viewHolder = null; if (convertView == null) { convertView = customInflater.inflate(layoutID, null); viewHolder = new ViewHolder(); viewHolder.m_order=(TextView) convertView.findViewById(R.id.m_order); viewHolder.m_MeterID=(TextView) convertView.findViewById(R.id.m_MeterID); viewHolder.m_RFID=(TextView) convertView.findViewById(R.id.m_RFID); viewHolder.m_Area=(TextView) convertView.findViewById(R.id.m_Area); viewHolder.m_clientName=(TextView) convertView.findViewById(R.id.m_clientName); viewHolder.m_clientAddress=(TextView) convertView.findViewById(R.id.m_clientAddress); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); // Log.d("MyCustomAdapter", "旧的convertView,position=" + position); } if (list!=null&&list.size()>0){ viewHolder.m_order.setText(String.valueOf(position+1)); viewHolder.m_MeterID.setText(PublicConstant.MeterID+rTask.MeterID); viewHolder.m_RFID.setText(PublicConstant.RFID+rTask.RFID); viewHolder.m_Area.setText(PublicConstant.Area+rTask.Area); viewHolder.m_clientName.setText(PublicConstant.ClientName+rTask.ClientName); viewHolder.m_clientAddress.setText(PublicConstant.ClientAddress+rTask.ClientAddress); } if (position == selectItem) { convertView.setBackgroundColor(Color.CYAN); } else { convertView.setBackgroundColor(Color.TRANSPARENT); } return convertView; } public void setSelectItem(int selectItem) { this.selectItem = selectItem; } private int selectItem=-1; }
3.在Activity的OnCreate中,对ListView初始化并找到适配器,
readyTaskList 为我自定义的List,这里大家可以根据自己的逻辑灵活应用
ListViewMeterReadinglist=(ListView) findViewById(R.id.MeterReadingList); customAdapter = new MyCustomAdapter(this, readyTaskList, R.layout.listview_item); MeterReadinglist.setAdapter(customAdapter);
4.ListView Item的设置,这里大家也可以灵活设置,只是需要注意与自己适配器类中的控件对应
<?xml version="1.0" encoding="utf-8"?> <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" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingBottom="2dp" android:paddingTop="2dp" > <TextView android:id="@+id/m_order" android:layout_width="36sp" android:layout_height="fill_parent" android:gravity="center" android:paddingRight="2dp" android:textSize="18sp" android:textStyle="bold" /> <View android:layout_width="1dp" android:layout_height="match_parent" android:background="@color/gray" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="7" android:orientation="vertical" android:paddingBottom="2dp" android:paddingTop="2dp" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="3dp" android:layout_marginRight="3dp" android:layout_marginTop="1dp" android:orientation="horizontal" > <TextView android:id="@+id/m_RFID" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="16sp" android:textStyle="bold" > </TextView> <TextView android:id="@+id/m_MeterID" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="16sp" > </TextView> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="3dp" android:layout_marginRight="3dp" android:layout_marginTop="1dp" android:orientation="horizontal" > <TextView android:id="@+id/m_Area" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" /> <TextView android:id="@+id/m_clientName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" /> <TextView android:id="@+id/m_clientAddress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="2" /> </LinearLayout> </LinearLayout> <ImageView android:id="@+id/RightOrWrong" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:contentDescription="TODO" /> </LinearLayout> </LinearLayout>
5.最重要的一步来了,就是我们如何调用呢,在Activity符合你条件的地方加上
customAdapter.setSelectItem(CURRENT_POSITION); customAdapter.notifyDataSetInvalidated();
我们可以看到setSelectItem是我们第二步自定义适配器里面的方法,用于获得当前的选中的Item项,然后接着调用notifyDataSetInvalidated();就行了,有人可能会发现此处不是用的notifyDataSetChanged(),的确这里我们需要的是对控件改变进行通知,而不是对其中的内容发生改变通知,详细可以了解notifyDataSetInvalidated()与notifyDataSetChanged()的相同不同点。
至次,整个逻辑完成,我们可以灵活控制ListView的某一项高亮显示