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

在我们使用ListView的时候,经常会遇到某一项(Item)需要高亮显示的情况,如下图,有人说当我们点击子项的时候会变亮,但有时候业务逻辑需要让ITEM根据条件自动变亮,下面我来介绍一下我自己的解决办法

Android编程心得-ListView的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的某一项高亮显示








你可能感兴趣的:(ListView)