Android编程心得-ListView的Item高亮显示的办法

来源:互联网 发布:java方法重写 编辑:程序博客网 时间:2024/04/30 19:10

在我们使用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;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn list.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn list.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic 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的某一项高亮显示