Android程式設計心得-ListView的Item高亮顯示的辦法
阿新 • • 發佈:2019-02-06
在我們使用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的某一項高亮顯示