本文轉自:http://www.cnblogs.com/dyllove98/archive/2013/07/31/3228601.html
在我們使用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的某一項高亮顯示
