Android 实现ListView/GridView等中Item被单击后背景色保持高亮

来源:互联网 发布:手机qq游戏网络异常 编辑:程序博客网 时间:2024/04/29 13:26

今天做一个商品查询,选择商品之后,以GridView显示属性和品种,点击选中之后保持高亮提示用户该项已被选择。本来准备使用GridView内嵌Button借用其Selector来实现。后来发现下面这种方法更加契合我的需求。

正好碰到该篇博客,以下是转载内容

今天为了解决一个需求,就是我有一个slidingDrawer,里面是一个ListView。然后,单击其中的Item,默认只是显示一个橙色背景后就恢复了。客户便有着个需求,需要单击这个Item的背景高亮。于是就Google咯。得到一位前辈的文章。故为了方便今后的学习温故,故作转载。

        

   用户点击ListView中的item时,有的时候我们想要选中的item高亮显示,以便提醒用户。原本以为只需要简单设置就能实现,但是并非如此。下面我们来介绍如何让选中的item高亮显示。

   方法一:简单实现

  此方法的思路就是在ListView的 OnItemClickListener 中,得到当前点击的View ,将其保存在Tag信息中,设置背景色为红色;如果tag信息存在的话,说明用户又单击了其他的View,这个时候将背景色取消即可,代码如下:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //item绑定菜品列表单击监听器  
  2.                listDishes.setOnItemClickListener(new OnItemClickListener(){  
  3.                    @Override  
  4.                    public void onItemClick(AdapterView<?> parent, View view,  
  5.                            int position, long id) {     
  6.                         if (((ListView)parent).getTag() != null){                            
  7.                              ((View)((ListView)parent).getTag()).setBackgroundDrawable(null);  
  8.                         }  
  9.                              ((ListView)parent).setTag(view);  
  10.                              view.setBackgroundColor(Color.RED);   
  11.                    }  
  12.                });  
      优点:实现简单

缺点:无法外部调用,比如我们想要实现点击按钮,listview自动选中下一个item


方法二: 为ListView实现自定义的适配器

   1.我们需要为ListView实现一个自定义的适配器,复写其中的getView方法。如果你不知道怎么做,推荐你先好好阅读一下这里:Android开发之ListView 适配器(Adapter)优化

   2.适配器中有一个成员变量,用于接收从外部传进来位置信息

   3.在适配器的getView方法中,将用户点击position位置处的View背景设置为屎黄色

  参考代码如下:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. import java.util.ArrayList;  
  2. import java.util.HashMap;  
  3. import java.util.List;  
  4. import tgb.com.R;  
  5. import android.app.Activity;  
  6. import android.content.Context;  
  7. import android.graphics.Color;  
  8. import android.os.Bundle;  
  9. import android.view.LayoutInflater;  
  10. import android.view.View;  
  11. import android.view.ViewGroup;  
  12. import android.widget.AdapterView;  
  13. import android.widget.BaseAdapter;  
  14. import android.widget.ListView;  
  15. import android.widget.TextView;  
  16. import android.widget.AdapterView.OnItemClickListener;  
  17.    
  18. public class DemoActivity extends Activity {  
  19.     //显示具体菜品  
  20.     private ListView listDishes = null;      
  21.       
  22.       
  23.     //具体菜品listview适配器  
  24.     private MyAdapter myAdapter;  
  25.       
  26.       
  27.     //列表,用来存放类别下的菜品  
  28.     List<HashMap<String, String>> data;      
  29.       
  30.     @Override  
  31.     protected void onCreate(Bundle savedInstanceState) {  
  32.         super.onCreate(savedInstanceState);  
  33.         setContentView(R.layout.menu);  
  34.           
  35.         //取得所有的菜品          
  36.         data =  this.getDishes();               
  37.               
  38.             myAdapter = new MyAdapter(this);    
  39.                       
  40.               
  41.             //寻找菜类别控件  
  42.             listDishes = (ListView)findViewById(R.id.listDishes);  
  43.             //设置适配器  
  44.             listDishes.setAdapter(myAdapter);      
  45.    
  46.    
  47.             //绑定菜品列表单击监听器  
  48.             listDishes.setOnItemClickListener(new OnItemClickListener(){  
  49.                 @Override  
  50.                 public void onItemClick(AdapterView<?> parent, View view,  
  51.                         int position, long id) {                      
  52.                     myAdapter.setSelectItem(5);    
  53.                     myAdapter.notifyDataSetInvalidated();    
  54.                 }  
  55.             });  
  56. }  
  57.    
  58.     /** 
  59.      * 获得菜品名称 
  60.      * @return 
  61.      */  
  62.     public List<HashMap<String, String>> getDishes() {  
  63.         //声明一个哈希数组  
  64.         ArrayList<HashMap<String, String>> list = new  ArrayList<HashMap<String, String>>();  
  65.         HashMap<String, String> map1 = new HashMap<String, String>();  
  66.         HashMap<String, String> map2 = new HashMap<String, String>();  
  67.         HashMap<String, String> map3 = new HashMap<String, String>();  
  68.         HashMap<String, String> map4 = new HashMap<String, String>();  
  69.         HashMap<String, String> map5 = new HashMap<String, String>();  
  70.         HashMap<String, String> map6 = new HashMap<String, String>();  
  71.         HashMap<String, String> map7 = new HashMap<String, String>();  
  72.         HashMap<String, String> map8 = new HashMap<String, String>();  
  73.           
  74.         //加载菜品信息  
  75.         map1.put("dish_name""鱼香肉丝");  
  76.         map1.put("dish_price""5元");  
  77.           
  78.    
  79.         map2.put("dish_name""麻婆豆腐");  
  80.         map2.put("dish_price""6元");  
  81.           
  82.    
  83.         map3.put("dish_name""茅台十五年");  
  84.         map3.put("dish_price""2580元");  
  85.           
  86.         map4.put("dish_name""考利干白");  
  87.         map4.put("dish_price""168元");  
  88.           
  89.         map5.put("dish_name""汉诺香槟");  
  90.         map5.put("dish_price""568元");  
  91.           
  92.         map6.put("dish_name""张裕香槟");  
  93.         map6.put("dish_price""168元");  
  94.           
  95.         map7.put("dish_name""杰克丹尼");  
  96.         map7.put("dish_price""35元/杯");  
  97.           
  98.         map8.put("dish_name""伏特加");  
  99.         map8.put("dish_price""50元/杯");  
  100.           
  101.         //添加进列表中  
  102.         list.add(map1);  
  103.         list.add(map2);  
  104.         list.add(map3);                 
  105.         list.add(map4);  
  106.         list.add(map5);  
  107.         list.add(map6);  
  108.         list.add(map7);  
  109.         list.add(map8);  
  110.         return list;  
  111.     }  
  112.       
  113.     /** 
  114.      * 静态类,用于ListView中存放菜品名称和单价     
  115.      * @author abing 
  116.      * 
  117.      */  
  118.      static class ViewHolder {  
  119.          TextView textDishName;  
  120.          TextView textDishPrice;  
  121.      }  
  122.        
  123.     /** 
  124.      * ListView适配器,实现有自己布局的Listview     
  125.      * @author abing 
  126.      * 
  127.      */  
  128.      public class MyAdapter extends BaseAdapter {    
  129.             private LayoutInflater mInflater;    
  130.             private int  selectItem=-1;    
  131.             public MyAdapter(Context context) {    
  132.                 this.mInflater = LayoutInflater.from(context);    
  133.             }    
  134.             public int getCount() {    
  135.                 // TODO Auto-generated method stub     
  136.                 return data.size();    
  137.             }    
  138.             public Object getItem(int arg0) {    
  139.                 // TODO Auto-generated method stub     
  140.                 return data.get(arg0);    
  141.             }    
  142.             public long getItemId(int arg0) {    
  143.                 // TODO Auto-generated method stub     
  144.                 return arg0;    
  145.             }    
  146.             public View getView(int position, View convertView, ViewGroup parent) {    
  147.                  
  148.                 ViewHolder holder;  
  149.                 
  150.                     if (convertView == null) {    
  151.                         holder = new ViewHolder();    
  152.                        //此处布局文件详见文章最后  
  153.                         convertView = mInflater.inflate(R.layout.list_dishes_detail, null);    
  154.                         holder.textDishName = (TextView) convertView.findViewById(R.id.dish_name);    
  155.                         holder.textDishPrice = (TextView) convertView.findViewById(R.id.dish_price);    
  156.                             
  157.                         convertView.setTag(holder);             
  158.                     } else {    
  159.                         holder = (ViewHolder) convertView.getTag();    
  160.                     }    
  161.                     holder.textDishName.setText(data.get(position).get("dish_name"));  
  162.                     holder.textDishPrice.setText(data.get(position).get("dish_price"));  
  163.                     //如果位置相同则设置背景为黄色  
  164.                     if (position == selectItem) {    
  165.                         convertView.setBackgroundColor(Color.YELLOW);    
  166.                     }     
  167.                     else {    
  168.                         convertView.setBackgroundColor(Color.TRANSPARENT);    
  169.                     }       
  170.    
  171.                     return convertView;  
  172.                 }  
  173.                
  174.             public  void setSelectItem(int selectItem) {    
  175.                  this.selectItem = selectItem;    
  176.             }    
  177.             
  178.         }   
  179. }  

R.layout.list_dishes_detail 布局文件如下

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="horizontal"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     android:paddingTop="1dip"  
  7.     android:paddingBottom="1dip"  
  8.     android:paddingLeft="10dip"  
  9.     android:paddingRight="10dip"  
  10.     >      
  11.       
  12.     <TextView  
  13.         android:id="@+id/dish_name"  
  14.         android:layout_width="100dip"  
  15.         android:layout_height="30dip"  
  16.         android:textSize="11pt"  
  17.         android:singleLine="true"          
  18.     />  
  19.    
  20.       
  21.     <TextView           
  22.         android:id="@+id/dish_price"  
  23.         android:layout_width="fill_parent"  
  24.         android:layout_height="fill_parent"  
  25.         android:gravity="right"  
  26.         android:textSize="11pt"   
  27.         android:singleLine="true"                  
  28.     />     
  29.      
  30. </LinearLayout>  

  优点:功能强大,灵活
  缺点:实现较为复杂,新手需要耐心调试
1 0
原创粉丝点击