ListView 支持展开显示

 转自http://griffinshi.javaeye.com/blog/583783

 

默认的ListView显示的item 是静态的 即不能改变的

 

 

[功能]

但是我们有有这样的需求 比如:当不选中某个item的时候 就显示一下大致信息 而当点开该item 会显示更多信息

 

有2个办法实现之:

1. ExpandableListActivity

2. BaseAdapter + notifyDataSetChanged()

 

[前提]

本例显示的大致信息是:星期一到星期天 当单击某个item 会显示更多信息 比如:ImageView TextView ...

 

 

写道
因为要显示的内容不是固定的 所以系统默认的Adapter肯定是不行的 只能 extends BaseAdapter

 

 

 

 

[代码 步骤]

1. 准备一些始终显示的内容 本例为:

 

Java代码 
  1. String[] week = new String[] {  
  2.             "January ","February ","March ","April ",  
  3.             "May","June","July","August","September","October","November","December "  
  4.     };  

 

 

 

2. 定义 CustomItemAdapter extends BaseAdapter

Java代码 
  1. public class CustomItemAdapter extends BaseAdapter {  
  2.         Activity activity;  
  3.           
  4.         public CustomItemAdapter(Activity a){  
  5.             activity = a;  
  6.         }  
  7.           
  8.         @Override  
  9.         public int getCount() {  
  10.             // TODO Auto-generated method stub  
  11.             return 0;  
  12.         }  
  13.   
  14.         @Override  
  15.         public Object getItem(int arg0) {  
  16.             // TODO Auto-generated method stub  
  17.             return null;  
  18.         }  
  19.   
  20.         @Override  
  21.         public long getItemId(int position) {  
  22.             // TODO Auto-generated method stub  
  23.             return 0;  
  24.         }  
  25.   
  26.         @Override  
  27.         public View getView(int position, View convertView, ViewGroup parent) {  
  28.             // TODO Auto-generated method stub  
  29.             return null;  
  30.         }  
  31.           
  32.     }  

 

 

 

3. 填充CustomItemAdapter的各个method

写道
其中 关键是 getView() 实现 要求: 

1. 星期TextView 是始终要显示的 

2. 当某项item 被单击 要显示更多细节 


所以 我打算如下做: 

1. 定义 View addDefaultViewByPosition(int i) 用于星期的显示 

2. 定义 View addCustomViewByPosition(int i) 用于更多细节的显示

 

Java代码 
  1. public View addDefaultViewByPosition(int i){  
  2.             TextView tv = new TextView(activity);  
  3.             tv.setText(week[i]);  
  4.               
  5.             tv.setTextColor(Color.RED);  
  6.             tv.setGravity(Gravity.CENTER_HORIZONTAL);  
  7.             return tv;  
  8.         }  
  9.           
  10.         public View addCustomViewByPosition(int i){  
  11.             View view = new View(activity);  
  12.               
  13.             switch(i){  
  14.             case 0:  
  15.                 ImageView iv0 = new ImageView(activity);  
  16.                 iv0.setImageResource(R.drawable.icon);  
  17.                   
  18.                 view = iv0;  
  19.                 break;  
  20.                   
  21.             case 1 :  
  22.                 RadioGroup group1 = new RadioGroup(activity);  
  23.                 group1.setOrientation(LinearLayout.HORIZONTAL);  
  24.                 RadioButton radio1 = new RadioButton(activity);  
  25.                 radio1.setText("Radio 1");  
  26.                 group1.addView(radio1);  
  27.                 RadioButton radio2 = new RadioButton(activity);  
  28.                 radio2.setText("Radio 2");  
  29.                 group1.addView(radio2);  
  30.                   
  31.                 view = group1;  
  32.                 break;  
  33.               
  34.             case 2:  
  35.                 TextView tv = new TextView(activity);  
  36.                 tv.setText("Hello to Gryphone!");  
  37.                 tv.setTextSize(20);  
  38.                   
  39.                 view = tv;  
  40.                 break;  
  41.             }  
  42.               
  43.             return view;  
  44.         }  

  

 

 

4. 通过 LinearLayout 把 addDefaultViewByPosition() 与 addCustomViewByPosition() 把二者以 LinearLayout.VERTICAL 方式组织起来

Java代码 
  1. public View getView(int arg0, View arg1, ViewGroup arg2) {  
  2.             // TODO Auto-generated method stub  
  3.             LinearLayout layout = new LinearLayout(activity);  
  4.             layout.setOrientation(LinearLayout.VERTICAL);  
  5.               
  6.             layout.addView(addDefaultViewByPosition(arg0));  
  7.               
  8.             if(ID == arg0){  
  9.                 layout.addView(addCustomViewByPosition(arg0));  
  10.             }  
  11.               
  12.             return layout;  
  13.         }  

 

 

 

5. 上面用到的变量 ID  用来代表你单击的item的id

Java代码 
  1. list.setOnItemClickListener(new OnItemClickListener(){  
  2.   
  3.             @Override  
  4.             public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,  
  5.                     long arg3) {  
  6.                 // TODO Auto-generated method stub  
  7.                 ID = arg2;  
  8.                   
  9.                 adapter.notifyDataSetChanged();  
  10.             }  
  11.               
  12.         });  

 

 

 

6. emulator 运行截图:

* 无任何单击的截图:

 ListView 支持展开显示

 

* 单击item 1 的截图 并与 addCustomViewByPosition() 里的界面代码比较一下

ListView 支持展开显示 

 

 

* 单击item 2 的截图 并与 addCustomViewByPosition() 里的界面代码比较一下

 ListView 支持展开显示

你可能感兴趣的:(ListView)