android ListView显示和隐藏二级内容

来源:互联网 发布:小t娱乐网源码 编辑:程序博客网 时间:2024/06/11 08:06

1.概述

android开发中,有时候发现ListView每一项内容比较多,展现全部内容会影响美观,且整个手机屏显示不了几条记录。这时需要筛选重点内容进行显示,而其他内容隐藏起来,当用户点击感兴趣的记录时才显示其他相对次要或详细信息。

本文将介绍一种实现上述功能点的listview使用样例,希望有所帮助!先上图:

截图1

2.代码实现

首先,介绍数据对象,比较简单。
[java] view plaincopy
  1. package com.example.dropdownlist;  
  2.   
  3. public class ListItem {  
  4.     public String title;  
  5.     public String subTitle;  
  6. }  

接下来,介绍MainActivity,其中,最重要的是MyAdapter对象adapter。后面将重点介绍该adapter是如何实现显示/隐藏二级内容的。
[java] view plaincopy
  1. package com.example.dropdownlist;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.os.Bundle;  
  6. import android.app.Activity;  
  7. import android.view.Menu;  
  8. import android.widget.ListView;  
  9.   
  10. public class MainActivity extends Activity {  
  11.   
  12.     private ListView lvContent;  
  13.       
  14.     private ArrayList<ListItem> alItems;  
  15.     private MyAdapter adapter;  
  16.       
  17.     @Override  
  18.     protected void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.activity_main);  
  21.           
  22.         lvContent = (ListView) this.findViewById(R.id.lv_content);  
  23.           
  24.         initData();  
  25.     }  
  26.       
  27.     /** 
  28.      * 初始化内容 
  29.      */  
  30.     private void initData()  
  31.     {  
  32.         alItems = new ArrayList<ListItem>();  
  33.           
  34.         // 一共20个item  
  35.         for (int i = 0; i < 20; i++) {  
  36.             ListItem item = new ListItem();  
  37.             item.title = "Title - " + i;  
  38.             item.subTitle = "Subtitle - " + i;  
  39.             alItems.add(item);  
  40.         }  
  41.           
  42.         adapter = new MyAdapter(this, alItems);  
  43.         lvContent.setAdapter(adapter);  
  44.     }  
  45.   
  46.     @Override  
  47.     public boolean onCreateOptionsMenu(Menu menu) {  
  48.         // Inflate the menu; this adds items to the action bar if it is present.  
  49.         getMenuInflater().inflate(R.menu.activity_main, menu);  
  50.         return true;  
  51.     }  
  52.   
  53. }  

下面是activity_main.xml布局文件,简单,就一个ListView。

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     tools:context=".MainActivity" >  
  7.   
  8.     <ListView   
  9.         android:id="@+id/lv_content"         
  10.         android:layout_width="match_parent"   
  11.         android:layout_height="wrap_content"  
  12.         android:choiceMode="singleChoice"  
  13.         android:scrollbars="none"  
  14.         android:cacheColorHint="@android:color/transparent"  
  15.         />  
  16.   
  17. </RelativeLayout>  

接下来是list_item.xml布局文件,表示每一个ListView item包含哪些内容。

[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:layout_margin="0.0dip"  
  6.     android:orientation="vertical" >  
  7.   
  8.     <RelativeLayout  
  9.         android:id="@+id/rl_top_bar"  
  10.         android:layout_width="match_parent"  
  11.         android:layout_height="wrap_content"  
  12.         android:layout_margin="0.0dip"  
  13.         android:background="@drawable/bg_list_item"  
  14.         android:clickable="true"  
  15.         android:padding="5.0dip" >  
  16.   
  17.         <ImageView  
  18.             android:id="@+id/iv_logo"  
  19.             android:layout_width="wrap_content"  
  20.             android:layout_height="wrap_content"  
  21.             android:layout_alignParentLeft="true"  
  22.             android:layout_centerVertical="true"  
  23.             android:background="@drawable/shape_imageview"  
  24.             android:src="@drawable/default_pic"  
  25.             android:layout_marginLeft="10dip"  
  26.             android:padding="2.0dip" />  
  27.   
  28.         <LinearLayout  
  29.             android:layout_width="match_parent"  
  30.             android:layout_height="match_parent"  
  31.             android:layout_centerVertical="true"  
  32.             android:layout_toRightOf="@+id/iv_logo"  
  33.             android:orientation="vertical"  
  34.             android:paddingLeft="5dip" >  
  35.   
  36.             <TextView  
  37.                 android:id="@+id/tv_title"  
  38.                 android:layout_width="match_parent"  
  39.                 android:layout_height="wrap_content"  
  40.                 android:singleLine="true"  
  41.                 android:textColor="@color/white"  
  42.                 android:textSize="18sp"  
  43.                 android:layout_marginLeft="5dip"  
  44.                 android:textStyle="bold" />  
  45.   
  46.             <TextView  
  47.                 android:id="@+id/tv_subtitle"  
  48.                 android:layout_width="match_parent"  
  49.                 android:layout_height="wrap_content"  
  50.                 android:singleLine="true"  
  51.                 android:textColor="@color/white"  
  52.                 android:textSize="16sp"  
  53.                 android:layout_marginLeft="10dip" />  
  54.         </LinearLayout>  
  55.     </RelativeLayout>  
  56.   
  57.     <LinearLayout  
  58.         android:id="@+id/ll_bottom_bar"  
  59.         android:layout_width="match_parent"  
  60.         android:layout_height="wrap_content"  
  61.         android:background="@drawable/bkg_drop_area"  
  62.         android:gravity="center_vertical"  
  63.         android:orientation="horizontal"  
  64.         android:padding="5dip"  
  65.         android:visibility="gone" >  
  66.   
  67.         <TextView  
  68.             android:id="@+id/tv_btn1"  
  69.             android:layout_width="0.0dip"  
  70.             android:layout_height="wrap_content"  
  71.             android:layout_weight="1.0"  
  72.             android:drawableTop="@drawable/bg_btn"  
  73.             android:gravity="center_horizontal"  
  74.             android:padding="3dip"  
  75.             android:text="@string/tv_btn1"  
  76.             android:textColor="@color/white"  
  77.             android:textSize="12sp" >  
  78.         </TextView>  
  79.   
  80.         <TextView  
  81.             android:id="@+id/tv_btn2"  
  82.             android:layout_width="0.0dip"  
  83.             android:layout_height="wrap_content"  
  84.             android:layout_weight="1.0"  
  85.             android:drawableTop="@drawable/bg_btn"  
  86.             android:gravity="center_horizontal"  
  87.             android:padding="3dip"  
  88.             android:text="@string/tv_btn2"  
  89.             android:textColor="@color/white"  
  90.             android:textSize="12sp" >  
  91.         </TextView>  
  92.   
  93.         <TextView  
  94.             android:id="@+id/tv_btn3"  
  95.             android:layout_width="0.0dip"  
  96.             android:layout_height="wrap_content"  
  97.             android:layout_weight="1.0"  
  98.             android:drawableTop="@drawable/bg_btn"  
  99.             android:gravity="center_horizontal"  
  100.             android:padding="3dip"  
  101.             android:text="@string/tv_btn3"  
  102.             android:textColor="@color/white"  
  103.             android:textSize="12sp" >  
  104.         </TextView>  
  105.     </LinearLayout>  
  106.   
  107. </LinearLayout>  

其中,需要重点关注RelativeLayout控件(android:id="@+id/rl_top_bar")和LinearLayout控件(android:id="@+id/ll_bottom_bar")。通过改变LinearLayout控件的visibility属性来显示或隐藏其中的子项内容,也就是二级内容。

最后,重点介绍一下MyAdapter。
[java] view plaincopy
  1. package com.example.dropdownlist;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.content.Context;  
  7. import android.view.LayoutInflater;  
  8. import android.view.View;  
  9. import android.view.ViewGroup;  
  10. import android.widget.BaseAdapter;  
  11. import android.widget.ImageView;  
  12. import android.widget.LinearLayout;  
  13. import android.widget.RelativeLayout;  
  14. import android.widget.TextView;  
  15. import android.widget.Toast;  
  16.   
  17. class ViewHolder {  
  18.     // 顶部控件  
  19.     public RelativeLayout rlTop;  
  20.     public ImageView ivLogo;  
  21.     public TextView tvTitle;  
  22.     public TextView tvSubTitle;  
  23.     // 底部控件  
  24.     public LinearLayout llBottom;  
  25.     public TextView tv1;  
  26.     public TextView tv2;  
  27.     public TextView tv3;  
  28. }  
  29.   
  30. public class MyAdapter extends BaseAdapter {  
  31.   
  32.     private Context mContext = null;  
  33.     private LayoutInflater mInflater = null;  
  34.     private List<ListItem> lData = null;  
  35.     // 用一组list保存下拉状态(true - 显示下拉, false - 隐藏下拉)  
  36.     public ArrayList<Boolean> lDropDown;  
  37.   
  38.     public MyAdapter(Context context, List<ListItem> list) {  
  39.         super();  
  40.         this.mContext = context;  
  41.         this.mInflater = LayoutInflater.from(context);  
  42.         this.lData = list;  
  43.   
  44.         // 初始状态,所有都不显示下拉  
  45.         lDropDown = new ArrayList<Boolean>();  
  46.         for (int i = 0; i < lData.size(); i++) {  
  47.             lDropDown.add(false);  
  48.         }  
  49.     }  
  50.   
  51.     @Override  
  52.     public int getCount() {  
  53.         return lData.size();  
  54.     }  
  55.   
  56.     @Override  
  57.     public Object getItem(int arg0) {  
  58.         return null;  
  59.     }  
  60.   
  61.     @Override  
  62.     public long getItemId(int position) {  
  63.         return 0;  
  64.     }  
  65.   
  66.     @Override  
  67.     public View getView(int position, View convertView, ViewGroup parent) {  
  68.         ViewHolder holder = null;  
  69.         if (convertView == null) {  
  70.             holder = new ViewHolder();  
  71.             convertView = mInflater.inflate(R.layout.list_item, null);  
  72.   
  73.             holder.rlTop = (RelativeLayout) convertView  
  74.                     .findViewById(R.id.rl_top_bar);  
  75.             holder.ivLogo = (ImageView) convertView.findViewById(R.id.iv_logo);  
  76.             holder.tvTitle = (TextView) convertView.findViewById(R.id.tv_title);  
  77.             holder.tvSubTitle = (TextView) convertView  
  78.                     .findViewById(R.id.tv_subtitle);  
  79.             holder.llBottom = (LinearLayout) convertView  
  80.                     .findViewById(R.id.ll_bottom_bar);  
  81.             holder.tv1 = (TextView) convertView.findViewById(R.id.tv_btn1);  
  82.             holder.tv2 = (TextView) convertView.findViewById(R.id.tv_btn2);  
  83.             holder.tv3 = (TextView) convertView.findViewById(R.id.tv_btn3);  
  84.             convertView.setTag(holder);  
  85.         } else {  
  86.             holder = (ViewHolder) convertView.getTag();  
  87.         }  
  88.   
  89.         ListItem item = lData.get(position);  
  90.   
  91.         holder.tvTitle.setText(item.title);  
  92.         holder.tvSubTitle.setText(item.subTitle);  
  93.   
  94.         if (lDropDown.get(position)) {  
  95.             holder.llBottom.setVisibility(View.VISIBLE);    // 显示下拉内容  
  96.         } else {  
  97.             holder.llBottom.setVisibility(View.GONE);       // 隐藏下拉内容  
  98.         }  
  99.   
  100.         final int index = position;  
  101.           
  102.         // 顶部控件组(RelativeLayout)响应点击操作,用于显示/隐藏底部控件组(下拉内容)  
  103.         holder.rlTop.setOnClickListener(new View.OnClickListener() {  
  104.   
  105.             @Override  
  106.             public void onClick(View v) {  
  107.                 boolean bFlagTemp = lDropDown.get(index);  
  108.                 for (int i = 0; i < lData.size(); i++) {  
  109.                     lDropDown.set(i, false);  
  110.                 }  
  111.                 lDropDown.set(index, !bFlagTemp);  
  112.                 notifyDataSetChanged();  
  113.             }  
  114.         });  
  115.   
  116.         holder.tv1.setOnClickListener(new View.OnClickListener() {  
  117.   
  118.             @Override  
  119.             public void onClick(View v) {  
  120.                 Toast.makeText(mContext, "list item - " + index + ", btn 1",  
  121.                         Toast.LENGTH_SHORT).show();  
  122.             }  
  123.         });  
  124.   
  125.         holder.tv2.setOnClickListener(new View.OnClickListener() {  
  126.   
  127.             @Override  
  128.             public void onClick(View v) {  
  129.                 Toast.makeText(mContext, "list item - " + index + ", btn 2",  
  130.                         Toast.LENGTH_SHORT).show();  
  131.             }  
  132.         });  
  133.   
  134.         holder.tv3.setOnClickListener(new View.OnClickListener() {  
  135.   
  136.             @Override  
  137.             public void onClick(View v) {  
  138.                 Toast.makeText(mContext, "list item - " + index + ", btn 3",  
  139.                         Toast.LENGTH_SHORT).show();  
  140.             }  
  141.         });  
  142.   
  143.         return convertView;  
  144.     }  
  145.   
  146. }  

仔细观察这部分代码,大伙会发现,其实就是利用lDropDown来记录着每一项listview item二级内容的显示/隐藏状态。每次点击listview item时会改变lDropDown开关序列,并刷新整个listview来达到二级内容显示/隐藏的目的。

下面两段代码是重点:
[java] view plaincopy
  1. if (lDropDown.get(position)) {  
  2.     holder.llBottom.setVisibility(View.VISIBLE);    // 显示下拉内容  
  3. else {  
  4.     holder.llBottom.setVisibility(View.GONE);       // 隐藏下拉内容  
  5. }  


[java] view plaincopy
  1. // 顶部控件组(RelativeLayout)响应点击操作,用于显示/隐藏底部控件组(下拉内容)  
  2. holder.rlTop.setOnClickListener(new View.OnClickListener() {  
  3.   
  4.     @Override  
  5.     public void onClick(View v) {  
  6.         boolean bFlagTemp = lDropDown.get(index);  
  7.         for (int i = 0; i < lData.size(); i++) {  
  8.             lDropDown.set(i, false);  
  9.         }  
  10.         lDropDown.set(index, !bFlagTemp);  
  11.         notifyDataSetChanged();  
  12.     }  
  13. });  

代码部分就讲到这里,大伙可以下载源码!

3.源码

http://download.csdn.net/detail/chadeltu/8377631
0 0
原创粉丝点击