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


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

            

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

       方法一:简单实现

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

    [java] view plain copy
     
     在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 plain copy
     
     在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 plain copy
     
     在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>  
      优点:功能强大,灵活
      缺点:实现较为复杂,新手需要耐心调试
     
    原文章链接:http://www.67tgb.com/?p=396
     
  • 相关阅读:
    Intent的跳转和传值
    Intent传值的学习
    Activity,Window,View之间是什么关系?
    MATCH_PARENT和FILL_PARENT之间的区别?
    Activity的运行过程
    onCreate和onStart谁的开销大?
    SDKManager连不上墙外的网,列表刷新不出来怎么办?
    AndroidEclipse里的视图里想添加SDK Manager但是找不到怎么办?
    出现“Unable to resolve target 'android-XXX'”怎么处理?
    安卓进程的生命周期
  • 原文地址:https://www.cnblogs.com/wangfeng520/p/6023633.html
Copyright © 2020-2023  润新知