1. 程式人生 > >Android程式設計心得-ListView的Item高亮顯示的辦法

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的某一項高亮顯示