zoukankan      html  css  js  c++  java
  • 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的某一项高亮显示








  • 相关阅读:
    Asp.Net Core 2.0 项目实战(11) 基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级 郑州
    NET项目反编译+VS解决方案整理流程 郑州
    iis 目录枚举文件枚举解决方案 郑州
    Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录 郑州
    SqlServer mssql 按月统计所有部门 郑州
    无法获得数据库 'model' 上的排他锁 解决方法 郑州
    Asp.Net Core 2.0 项目实战(5)Memcached踩坑,基于EnyimMemcachedCore整理MemcachedHelper帮助类。 郑州
    谈谈前端怎样布局切图,程序可以方便快捷添加程序 郑州
    各种UIColor颜色的设置
    iOS
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3228601.html
Copyright © 2011-2022 走看看