关闭

[置顶] 最全ListView扩展的实例和补充

1054人阅读 评论(0) 收藏 举报
分类:


                  ListView相信大家都是很熟练的,但是ListView的功能还是有不少的,如:具有弹性的ListView、自动显示隐藏的ListView、聊天ListView、动态改变ListView的布局...下面我们来看看吧:

     1.  ListView的常用属性:(因为很简单就不做详细的介绍啦)

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0"encoding="utf-8"?>
    <ListView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/listview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:cacheColorHint="#00000000" 
        android:dividerHeight="30px"
        android:divider="@drawable/ic_launcher"
        android:fadingEdge="vertical"
        android:scrollbars="horizontal|vertical"
        android:fastScrollEnabled="true"
        android:scrollbarStyle="outsideInset"
        />
    <!-- 
     android:cacheColorHint="#00000000" //设置拖动背景色为透明  
     android:dividerHeight="30px"        //listview item之间的高度
     android:divider="@drawable/ic_launcher"   //listview item之间的背景或者说是颜色
     android:fadingEdge="vertical"        //上边和下边有黑色的阴影      值为none的话就没有阴影
     android:scrollbars="horizontal|none"  //只有值为horizontal|vertical的时候,才会显示滚动条,并且会自动影藏和显示
     android:fastScrollEnabled="true"       //快速滚动效果,配置这个属性,在快速滚动的时候旁边会出现一个小方块的快速滚动效果,自动隐藏和显示,
     android:scrollbarStyle="outsideInset" //四个值的含义如下
    1>outsideInset :  该ScrollBar显示在视图(view)的边缘,增加了view的padding. 如果可能的话,该ScrollBar仅仅覆盖这个view的背景.
    2>outsideOverlay :  该ScrollBar显示在视图(view)的边缘,不增加view的padding,该ScrollBar将被半透明覆盖
    3>insideInset :该ScrollBar显示在padding区域里面,增加了控件的padding区域,该ScrollBar不会和视图的内容重叠.
    4>insideOverlay : 该ScrollBar显示在内容区域里面,不会增加了控件的padding区域,该ScrollBar以半透明的样式覆盖在视图(view)的内容上.


2. ListView的一些重要属性:

首先是stackFromBottom属性,这只该属性之后你做好的列表就会显示你列表的最下面,值为true和false

android:stackFromBottom="true"

第二是transciptMode属性,需要用ListView或者其它显示大量Items的控件实时跟踪或者查看信息,并且希望最新的条目可以自动滚动到可视范围内。通过设置的控件transcriptMode属性可以将Android平台的控件(支持ScrollBar)自动滑动到最底部。
android:transcriptMode="alwaysScroll"

第三cacheColorHint属性,很多人希望能够改变一下它的背景,使他能够符合整体的UI设计,改变背景背很简单只需要准备一张图片然后指定属性android:background="@drawable/bg",不过不要高兴地太早,当你这么做以后,发现背景是变了,但是当你拖动,或者点击list空白位置的时候发现ListItem都变成黑色的了,破坏了整体效果。

如果你只是换背景的颜色的话,可以直接指定android:cacheColorHint为你所要的颜色,如果你是用图片做背景的话,那也只要将android:cacheColorHint指定为透明(#00000000)就可以了

第四divider属性,该属性作用是每一项之间需要设置一个图片做为间隔,或是去掉item之间的分割线

android:divider="@drawable/list_driver"  其中  @drawable/list_driver 是一个图片资源,如果不想显示分割线则只要设置为android:divider="@drawable/@null" 就可以了

第五fadingEdge属性,上边和下边有黑色的阴影

android:fadingEdge="none"设置后没有阴影了~

第六scrollbars属性,作用是隐藏listView的滚动条,

android:scrollbars="none"与setVerticalScrollBarEnabled(true);的效果是一样的,不活动的时候隐藏,活动的时候也隐藏

第七fadeScrollbars属性,android:fadeScrollbars="true"  配置ListView布局的时候,设置这个属性为true就可以实现滚动条的自动隐藏和显示。

第八fastScrollEnabled属性 ,

很多开发者不知道ListView列表控件的快速滚动滑块是如何启用的,这里Android开发网告诉大家,辅助滚动滑块只需要一行代码就可以搞定,如果你使用XML布局只需要在ListView节点中加入  android:fastScrollEnabled="true" 这个属性即可,而对于Java代码可以通过myListView.setFastScrollEnabled(true); 来控制启用,参数false为隐藏。 还有一点就是当你的滚动内容较小,不到当前ListView的3个屏幕高度时则不会出现这个快速滚动滑块,同时该方法仍然是AbsListView的基础方法,可以在ListView或GridView等子类中使用快速滚动辅助。

第九drawSelectorOnTop属性

When set to true, the selector will be drawn over the selecteditem. Otherwise the selector is drawn behind the selected item. Thedefault value is false.

android:drawSelectorOnTop="true" 点击某一条记录,颜色会显示在最上面,记录上的文字被遮住,所以点击文字不放,文字就看不到

android:drawSelectorOnTop="false"点击某条记录不放,颜色会在记录的后面,成为背景色,但是记录内容的文字是可见的




3. ListView的扩展:


 今天从网上看了个扩展的listView的例子,感觉还蛮炫,自己也试着做了下。

           由于比较简单,所有就直接上代码:

         

[html] view plain copy
  1. public class ExtendedListView extends ExpandableListActivity {  
  2.   
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         // TODO Auto-generated method stub  
  6.         super.onCreate(savedInstanceState);  
  7.           
  8.         MyExpandableListAdapter adapter=new MyExpandableListAdapter();  
  9.         setListAdapter(adapter);  
  10.           
  11.     }  
  12.     public class MyExpandableListAdapter extends BaseExpandableListAdapter{  
  13.         public String[] groups={"我的好友","大学同学","高中同学"};  
  14.         public String[][] childrens={{"小张","小李","小丽","向明"},{"向明","向明","向明","向明"},{"向明","向明","向明","向明"}};  
  15.         public Object getChild(int groupPosition, int childPosition) {  
  16.             // TODO Auto-generated method stub  
  17.             return childrens[groupPosition][childPosition];  
  18.         }  
  19.   
  20.         public long getChildId(int groupPosition, int childPosition) {  
  21.             // TODO Auto-generated method stub  
  22.             return childPosition;  
  23.         }  
  24.   
  25.         public View getChildView(int groupPosition, int childPosition,  
  26.                 boolean isLastChild, View convertView, ViewGroup parent) {  
  27.             // TODO Auto-generated method stub  
  28.             TextView textView=getGenericView();  
  29.             textView.setText(getChild(groupPosition, childPosition).toString());  
  30.             return textView;  
  31.         }  
  32.         //新建一个TextView  
  33.          public TextView getGenericView() {  
  34.                 // Layout parameters for the ExpandableListView  
  35.                 AbsListView.LayoutParams lp = new AbsListView.LayoutParams(  
  36.                         ViewGroup.LayoutParams.MATCH_PARENT, 64);  
  37.   
  38.                 TextView textView = new TextView(ExtendedListView.this);  
  39.                 textView.setLayoutParams(lp);  
  40.                 // Center the text vertically  
  41.                 textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);  
  42.                 // Set the text starting position  
  43.                 textView.setPadding(36, 0, 0, 0);  
  44.                 return textView;  
  45.             }  
  46.               
  47.         public int getChildrenCount(int groupPosition) {  
  48.             // TODO Auto-generated method stub  
  49.             return childrens[groupPosition].length;  
  50.         }  
  51.   
  52.         public Object getGroup(int groupPosition) {  
  53.             // TODO Auto-generated method stub  
  54.             return groups[groupPosition];  
  55.         }  
  56.   
  57.         public int getGroupCount() {  
  58.             // TODO Auto-generated method stub  
  59.             return groups.length;  
  60.         }  
  61.   
  62.         public long getGroupId(int groupPosition) {  
  63.             // TODO Auto-generated method stub  
  64.             return groupPosition;  
  65.         }  
  66.   
  67.         public View getGroupView(int groupPosition, boolean isExpanded,  
  68.                 View convertView, ViewGroup parent) {  
  69.             // TODO Auto-generated method stub  
  70.             TextView textView = getGenericView();  
  71.             textView.setText(getGroup(groupPosition).toString());  
  72.             return textView;  
  73.         }  
  74.   
  75.         public boolean hasStableIds() {  
  76.             // TODO Auto-generated method stub  
  77.             return true;  
  78.         }  
  79.   
  80.         public boolean isChildSelectable(int groupPosition, int childPosition) {  
  81.             // TODO Auto-generated method stub  
  82.             return true;  
  83.         }  
  84.           
  85.     }  
  86. }  

      看一下运行在模拟器上的效果:

     



4. 具有弹性的ListView:

效果图:



主要代码:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. import android.content.Context;  
  2. import android.graphics.Rect;  
  3. import android.util.AttributeSet;  
  4. import android.view.MotionEvent;  
  5. import android.view.animation.Animation;  
  6. import android.view.animation.Animation.AnimationListener;  
  7. import android.view.animation.TranslateAnimation;  
  8. import android.widget.AbsListView;  
  9. import android.widget.ListView;  
  10.   
  11. /** 
  12.  * ElasticScrollView有弹性的ListView 
  13.  */  
  14. public class ElasticListView extends ListView {  
  15.     private float y;  
  16.     private Rect normal = new Rect();  
  17.     private boolean animationFinish = true;  
  18.   
  19.     public ElasticListView(Context context) {  
  20.         super(context);  
  21.         init();  
  22.     }  
  23.   
  24.     public ElasticListView(Context context, AttributeSet attrs) {  
  25.         super(context, attrs);  
  26.         init();  
  27.     }  
  28.   
  29.     protected void onScrollChanged(int l, int t, int oldl, int oldt) {  
  30.   
  31.     }  
  32.   
  33.     boolean overScrolled = false;  
  34.     private void init() {  
  35.         setOnScrollListener(new OnScrollListener() {  
  36.             @Override  
  37.             public void onScrollStateChanged(AbsListView view, int scrollState) {  
  38.             }  
  39.   
  40.             @Override  
  41.             public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {  
  42.                 overScrolled = false;  
  43.             }  
  44.         });  
  45.     }  
  46.       
  47.     @Override  
  48.     protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {  
  49.         overScrolled = true;  
  50.     }  
  51.   
  52.     @Override  
  53.     public boolean onTouchEvent(MotionEvent ev) {  
  54.         commOnTouchEvent(ev);  
  55.         return super.onTouchEvent(ev);  
  56.     }  
  57.   
  58.     public void commOnTouchEvent(MotionEvent ev) {  
  59.         if (animationFinish) {  
  60.             int action = ev.getAction();  
  61.             switch (action) {  
  62.             case MotionEvent.ACTION_DOWN:  
  63.                 y = ev.getY();  
  64.                 break;  
  65.             case MotionEvent.ACTION_UP:  
  66.                 y = 0;  
  67.                 if (isNeedAnimation()) {  
  68.                     animation();  
  69.                 }  
  70.                 break;  
  71.             case MotionEvent.ACTION_MOVE:  
  72.                 final float preY = y == 0 ? ev.getY() : y;  
  73.                 float nowY = ev.getY();  
  74.                 int deltaY = (int) (preY - nowY);  
  75.   
  76.                 y = nowY;  
  77.                 // 当滚动到最上或者最下时就不会再滚动,这时移动布局  
  78.                 if (isNeedMove(deltaY)) {  
  79.                     if (normal.isEmpty()) {  
  80.                         // 保存正常的布局位置  
  81.                         normal.set(getLeft(), getTop(), getRight(), getBottom());  
  82.                     }  
  83.                     // 移动布局  
  84.                     layout(getLeft(), getTop() - deltaY / 2, getRight(), getBottom() - deltaY / 2);  
  85.                 }  
  86.                 break;  
  87.             default:  
  88.                 break;  
  89.             }  
  90.         }  
  91.     }  
  92.   
  93.     // 开启动画移动  
  94.     public void animation() {  
  95.         // 开启移动动画  
  96.         TranslateAnimation ta = new TranslateAnimation(000, normal.top - getTop());  
  97.         ta.setDuration(200);  
  98.         ta.setAnimationListener(new AnimationListener() {  
  99.             @Override  
  100.             public void onAnimationStart(Animation animation) {  
  101.                 animationFinish = false;  
  102.   
  103.             }  
  104.   
  105.             @Override  
  106.             public void onAnimationRepeat(Animation animation) {  
  107.   
  108.             }  
  109.   
  110.             @Override  
  111.             public void onAnimationEnd(Animation animation) {  
  112.                 clearAnimation();  
  113.                 // 设置回到正常的布局位置  
  114.                 layout(normal.left, normal.top, normal.right, normal.bottom);  
  115.                 normal.setEmpty();  
  116.                 animationFinish = true;  
  117.             }  
  118.         });  
  119.         startAnimation(ta);  
  120.     }  
  121.   
  122.     // 是否需要开启动画  
  123.     public boolean isNeedAnimation() {  
  124.         return !normal.isEmpty();  
  125.     }  
  126.   
  127.     // 是否需要移动布局  
  128.     public boolean isNeedMove(float deltaY) {  
  129.         if (overScrolled && getChildCount() > 0) {  
  130.             if (getLastVisiblePosition() == getCount() - 1 && deltaY > 0) {  
  131.                 return true;  
  132.             }  
  133.             if (getFirstVisiblePosition() == 0 && deltaY < 0) {  
  134.                 return true;  
  135.             }  
  136.         }  
  137.         return false;  
  138.     }  
  139. }  

测试代码:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class MainActivity extends Activity {  
  2.     ElasticListView listView;  
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_main);  
  7.           
  8.         listView = (ElasticListView) findViewById(R.id.listview);  
  9.           
  10.         String[] listValues = new String[20];  
  11.         for (int i=0;i<listValues.length;i++) {  
  12.             listValues[i] = "TextView" + i;  
  13.         }  
  14.         listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listValues));  
  15.     }  
  16. }  

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class MainActivity extends Activity {  
  2.     ElasticListView listView;  
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_main);  
  7.           
  8.         listView = (ElasticListView) findViewById(R.id.listview);  
  9.           
  10.         String[] listValues = new String[20];  
  11.         for (int i=0;i<listValues.length;i++) {  
  12.             listValues[i] = "TextView" + i;  
  13.         }  
  14.         listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listValues));  
  15.     }  
  16. }  

5. 自动显示、隐藏布局的ListView:


  下面这个效果是,向下滑动 ListView ,其顶部布局自动显示;向上滑动 ListView ,其顶部的布局自动隐藏。效果如下:


       首先这个效果的实现大致需要如下几步:

       1. 让其没有 ActionBar ,可在 style.xml 中设置主题样式 Theme.AppCompat.Light.NoActionBar 。

       2. 为了让 ListView 的第一个条目不被其顶部的布局所遮住,所以给 ListView 增加了一个头部 HeaderView 。头部的高度正好等于 ActionBar 的高度,高度为:R.dimen.abc_action_bar_default_height_material 。
       添加头部的代码:
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. // 给 ListView 添加一个 HeaderView  
  2.        View header = new View(this);  
  3.        header.setLayoutParams(new AbsListView.LayoutParams(  
  4.                ViewGroup.LayoutParams.MATCH_PARENT,  
  5.                // 高度根据屏幕不一样,大小不一  
  6.                // (此处可以使用 R.dimen.abc_action_bar_default_height_material)  
  7.                (int) getResources().getDimension(  
  8.                R.dimen.abc_action_bar_default_height_material)));  
  9.        mListView.addHeaderView(header);  

      3. 设置 ListView 的最小滑动距离,其滑动距离大于最小滑动距离后我们才认为 ListView 有所滑动,得到最小滑动距离代码:
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. minInstance = ViewConfiguration.get(this).getScaledTouchSlop();  

      4. 由上面的第三步可以看出,要判断其滑动,或者根据其需要上下的滑动来显示或者隐藏 ListView 顶部的布局都需要滑动监听事件,可以使用 OnTouchListener 接口来完成。在该接口重写的 onTouch() 方法中来获取滑动的坐标,并根据坐标差来判断 ListView 的滑动方向。


      5. 由于需要根据 ListView 的滑动方向来显示或者隐藏其顶部的布局,所以其顶部的布局需要有显示或者隐藏的动画效果,可以使用 ObjectAnimator 来实现。关于 ObjectAnimator 在前面的博客中有所使用。

      6. 当然了要实现该效果还需要在布局文件中让一个组件至于 ListView 上才行,布局文件代码:
activity_main.xml ;
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent">  
  5.   
  6.     <ListView  
  7.         android:id="@+id/list_view"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="match_parent"/>  
  10.   
  11.     <android.support.v7.widget.Toolbar  
  12.         android:id="@+id/toolbar"  
  13.         android:background="@android:color/holo_blue_dark"  
  14.         android:layout_width="match_parent"  
  15.         android:layout_height="wrap_content"/>  
  16. </RelativeLayout>  


完整的 MainActivity.java 的代码:
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.crazy.showlistview;  
  2.   
  3. import android.animation.ObjectAnimator;  
  4. import android.support.v7.app.AppCompatActivity;  
  5. import android.os.Bundle;  
  6. import android.support.v7.widget.Toolbar;  
  7. import android.view.MotionEvent;  
  8. import android.view.View;  
  9. import android.view.ViewConfiguration;  
  10. import android.view.ViewGroup;  
  11. import android.widget.AbsListView;  
  12. import android.widget.ArrayAdapter;  
  13. import android.widget.ListView;  
  14.   
  15. public class MainActivity extends AppCompatActivity {  
  16.   
  17.     private ListView mListView;  
  18.     private Toolbar mToolbar;  
  19.     // 最小滑动距离  
  20.     private int minInstance;  
  21.     // 记录开始位置  
  22.     private float mFirstY;  
  23.     // 当前位置  
  24.     private float mCurrentY;  
  25.     // 滑动的两种状态( 0 向下, 1 向上)  
  26.     private int status;  
  27.     private boolean mShow = true;  
  28.     private ObjectAnimator animator;  
  29.   
  30.     @Override  
  31.     protected void onCreate(Bundle savedInstanceState) {  
  32.         super.onCreate(savedInstanceState);  
  33.         setContentView(R.layout.activity_main);  
  34.   
  35.         init();  
  36.         scrollListViewEvent();  
  37.     }  
  38.   
  39.     private void init() {  
  40.   
  41.         String[] strings = new String[20];  
  42.         int length = strings.length;  
  43.         for (int i = 0; i < length; i++) {  
  44.             strings[i] = "数据:" + i;  
  45.         }  
  46.   
  47.         mListView = (ListView)findViewById(R.id.list_view);  
  48.         mToolbar = (Toolbar)findViewById(R.id.toolbar);  
  49.         // 给 ListView 添加一个 HeaderView  
  50.         View header = new View(this);  
  51.         header.setLayoutParams(new AbsListView.LayoutParams(  
  52.                 ViewGroup.LayoutParams.MATCH_PARENT,  
  53.                 // 高度根据屏幕不一样,大小不一  
  54.                 // (此处可以使用 R.dimen.abc_action_bar_default_height_material)  
  55.                 (int) getResources().getDimension(  
  56.                 R.dimen.abc_action_bar_default_height_material)));  
  57.         mListView.addHeaderView(header);  
  58.   
  59.         mListView.setAdapter(new ArrayAdapter<>(this,  
  60.                 android.R.layout.simple_list_item_1, strings));  
  61.         minInstance = ViewConfiguration.get(this).getScaledTouchSlop();  
  62.     }  
  63.   
  64.   
  65.     private void scrollListViewEvent(){  
  66.         mListView.setOnTouchListener(new View.OnTouchListener() {  
  67.             @Override  
  68.             public boolean onTouch(View v, MotionEvent event) {  
  69.                 switch (event.getAction()) {  
  70.                     case MotionEvent.ACTION_DOWN:  
  71.                         mFirstY = event.getY();  
  72.                         break;  
  73.                     case MotionEvent.ACTION_MOVE:  
  74.                         mCurrentY = event.getY();  
  75.                         if (mCurrentY - mFirstY > minInstance) {  
  76.                             status = 0;  // 向下  
  77.                         } else {  
  78.                             status = 1;  // 向上  
  79.                         }  
  80.                         if (status == 1) {  
  81.                             if (mShow) {  
  82.                                 toolbarAnim(1);  // 隐藏  
  83.                                 mShow = false;  
  84.                             }  
  85.                         } else {  
  86.                             if (!mShow) {  
  87.                                 toolbarAnim(0); // 显示  
  88.                                 mShow = true;  
  89.                             }  
  90.                         }  
  91.                         break;  
  92.                 }  
  93.                 return false;  
  94.             }  
  95.         });  
  96.   
  97.     }  
  98.   
  99.     private void toolbarAnim(int i) {  
  100.         if (animator != null && animator.isRunning()) animator.cancel();  
  101.         if (i == 0)  
  102.             animator = ObjectAnimator.ofFloat(  
  103.                     mToolbar,  
  104.                     "translationY",  
  105.                     mToolbar.getTranslationY(),  
  106.                     0);  
  107.         else  
  108.             animator = ObjectAnimator.ofFloat(  
  109.                     mToolbar,  
  110.                     "translationY",  
  111.                     mToolbar.getTranslationY(),  
  112.                     -mToolbar.getHeight());  
  113.         animator.start();  
  114.     }  
  115. }  


6. ListView实现聊天:


下载地址:http://download.csdn.net/detail/shenggaofei/9615547

SimpleAdapter适配器初次尝试,那么离实现最终想要的效果也不远啦,只要仿照chata的布局,再编写第二位聊天人(“路人甲”)的布局chatb——只要让他靠右显示就行~。

但是这样我们每次都要很麻烦的定义一遍SimpleAdapter,为了“偷懒”,我们直接来编写自己的Adapter,这样每次定义就方便多了。

先附上最终的代码:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public void onCreate(Bundle savedInstanceState) {  
  2.             super.onCreate(savedInstanceState);  
  3.             setContentView(R.layout.main);  
  4.             chatlist = (ListView) findViewById(R.id.chatlist);  
  5.             list = new ArrayList<ChatEntity>();  
  6.             ChatEntity chat1=new ChatEntity("小魏","嗨~",R.layout.chata);  
  7.             list.add(chat1);  
  8.             ChatEntity chat2=new ChatEntity("路人甲","你好!",R.layout.chatb);  
  9.             list.add(chat2);  
  10.             ChatEntity chat3=new ChatEntity("小魏","我是小魏~",R.layout.chata);  
  11.             list.add(chat3);  
  12.               
  13.             chatlist.setAdapter(new ChatAdapter(TryChatPop2Activity.this,list));  
  14. }  

如上代码,在setAdapter时使用了自己的ChatAdapter,以下是类文件代码:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class ChatAdapter implements ListAdapter{  
  2.     private ArrayList<ChatEntity> list;  
  3.     private Context ctx;  
  4.   
  5.     public ChatAdapter(Context context ,ArrayList<ChatEntity> list) {  
  6.         ctx = context;  
  7.         this.list = list;  
  8.     }  
  9.       
  10.     public boolean areAllItemsEnabled() {  
  11.         return false;  
  12.     }  
  13.     public boolean isEnabled(int arg0) {  
  14.         return false;  
  15.     }  
  16.     public int getCount() {  
  17.         return list.size();  
  18.     }  
  19.     public Object getItem(int position) {  
  20.         return list.get(position);  
  21.     }  
  22.     public long getItemId(int position) {  
  23.         return position;  
  24.     }  
  25.     public int getItemViewType(int position) {  
  26.         return position;  
  27.     }  
  28.     public View getView(int position, View convertView, ViewGroup parent) {  
  29.         ChatEntity entity = list.get(position);  
  30.         int itemLayout = entity.getLayoutID();  
  31.           
  32.         LinearLayout layout = new LinearLayout(ctx);  
  33.         LayoutInflater vi = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  34.         vi.inflate(itemLayout, layout,true);  
  35.           
  36.         TextView txvName = (TextView) layout.findViewById(R.id.txvName);  
  37.         txvName.setText(entity.getName());  
  38.           
  39.         TextView txvText = (TextView) layout.findViewById(R.id.txvInfo);  
  40.         txvText.setText(entity.getInfo());  
  41.         return layout;  
  42.     }  
  43.     public int getViewTypeCount() {  
  44.         return list.size();  
  45.     }  
  46.     public boolean hasStableIds() {  
  47.         return false;  
  48.     }  
  49.     public boolean isEmpty() {  
  50.         return false;  
  51.     }  
  52.     public void registerDataSetObserver(DataSetObserver observer) {  
  53.     }  
  54.     public void unregisterDataSetObserver(DataSetObserver observer) {  
  55.     }  
  56.   
  57. }  

ChatAdapterd的类实现了ListAdapter的接口,并通过ChatEntity中的内容设置了定义布局中聊天对象名字txvName及聊天内容txvInfo的内容,当然你肯定能明白ChatEntity就是存放聊天信息等内容的实体类。

这里我们可以这样写,就是因为ListAdapter的接口是绑定Data和ListView的适配器,实际上我们常用的ArryaAdapter、SimpleAdapter、CursorAdapter就是他的子类。

关系如下:

这样再看代码,甚至再回头看SimpleAdapter就感觉好理解多了,其他内容不细说了,具体参照源码:http://download.csdn.net/detail/xiaowei_cqu/3886321

再上一遍效果图:





7. 动态改变ListView的布局:
效果图:


代码如下:  
  1. import android.app.ListActivity;  
  2. import android.content.Context;  
  3. import android.os.Bundle;  
  4. import android.view.Gravity;  
  5. import android.view.LayoutInflater;  
  6. import android.view.View;  
  7. import android.view.ViewGroup;  
  8. import android.widget.AdapterView;  
  9. import android.widget.AdapterView.OnItemClickListener;  
  10. import android.widget.BaseAdapter;  
  11. import android.widget.ImageView;  
  12. import android.widget.LinearLayout;  
  13. import android.widget.TextView;  
  14.   
  15. public class MainActivity extends ListActivity {  
  16.   
  17.     private ListAddLayoutAdapter mAdapter;  
  18.     @SuppressWarnings("unused")  
  19.     private LayoutInflater lInflater;;  
  20.       
  21.     int[] image = {  
  22.             R.drawable.s_beibei,  
  23.             R.drawable.s_jingjing,  
  24.             R.drawable.s_huanhuan,  
  25.             R.drawable.s_yingying,  
  26.             R.drawable.s_nini  
  27.         };  
  28.       
  29.     String[] show_name = {  
  30.             "贝贝",  
  31.             "晶晶",  
  32.             "欢欢",  
  33.             "迎迎",  
  34.             "妮妮"  
  35.         };  
  36.       
  37.     private int id = 0;  
  38.     @SuppressWarnings("unused")  
  39.     private int last = 0;   
  40.       
  41.     @Override  
  42.     public void onCreate(Bundle savedInstanceState) {  
  43.         super.onCreate(savedInstanceState);  
  44.         mAdapter = new ListAddLayoutAdapter(this);  
  45.         this.setListAdapter(mAdapter);  
  46.          
  47.         this.getListView().setOnItemClickListener(new OnItemClickListener(){  
  48.             public void onItemClick(AdapterView<?> arg0, View arg1, int position,  
  49.                     long arg3) {  
  50.                 id = position;  
  51.                 mAdapter.notifyDataSetChanged();  
  52.                 last = position;  
  53.             }  
  54.         });  
  55.     }  
  56.       
  57.      public class ListAddLayoutAdapter extends BaseAdapter {  
  58.   
  59.         private Context context;  
  60.         private MainActivity activity;   
  61.           
  62.         public ListAddLayoutAdapter(Context context) {  
  63.             this.context = context;  
  64.             this.activity = (MainActivity)context;  
  65.             lInflater = activity.getLayoutInflater();  
  66.         }  
  67.            
  68.         public int getCount() {  
  69.             return image.length;  
  70.         }  
  71.   
  72.         public Object getItem(int arg0) {  
  73.             return null;  
  74.         }  
  75.   
  76.         public long getItemId(int position) {  
  77.             return position;  
  78.         }  
  79.   
  80.         public View getView(int position, View arg1, ViewGroup arg2) {  
  81.             LinearLayout layout = new LinearLayout(context);  
  82.             layout.setOrientation(LinearLayout.VERTICAL);  
  83.             layout.setPadding(0808);  
  84.               
  85.             layout.addView(addTitleView(position));  
  86.               
  87.             if(id==position){  
  88.                 layout.addView(addCustomView(position));  
  89.             }  
  90.               
  91.             return layout;  
  92.         }  
  93.           
  94.         public View addTitleView(int i){  
  95.             LinearLayout layout = new LinearLayout(context);  
  96.             layout.setOrientation(LinearLayout.HORIZONTAL);  
  97.               
  98.             ImageView iv = new ImageView(context);  
  99.             iv.setImageResource(image[i]);  
  100.             layout.addView(iv,  
  101.                     new LinearLayout.LayoutParams(  
  102.                             LinearLayout.LayoutParams.WRAP_CONTENT,   
  103.                             LinearLayout.LayoutParams.WRAP_CONTENT));  
  104.               
  105.               
  106.             TextView tv = new TextView(context);  
  107.             tv.setText(show_name[i]);  
  108.             tv.setTextSize(18f);  
  109.             layout.addView(tv,  
  110.                     new LinearLayout.LayoutParams(  
  111.                             LinearLayout.LayoutParams.WRAP_CONTENT,   
  112.                             LinearLayout.LayoutParams.WRAP_CONTENT));  
  113.               
  114.             layout.setGravity(Gravity.CENTER);  
  115.             return layout;  
  116.         }  
  117.           
  118.           
  119.         public View addCustomView(int i){  
  120.             View view = new View(context);  
  121.               
  122.             switch(i){  
  123.                 case 0:  
  124.                     ImageView iv1 = new ImageView(context);  
  125.                     iv1.setImageResource(R.drawable.beibei);  
  126.                     view = iv1;  
  127.                     break;  
  128.                       
  129.                 case 1:  
  130.                     ImageView iv2 = new ImageView(context);  
  131.                     iv2.setImageResource(R.drawable.jingjing);  
  132.                     view = iv2;  
  133.                     break;  
  134.                       
  135.                 case 2:  
  136.                     ImageView iv3= new ImageView(context);  
  137.                     iv3.setImageResource(R.drawable.huanhuan);  
  138.                     view = iv3;  
  139.                     break;  
  140.                 case 3:  
  141.                     ImageView iv4 = new ImageView(context);  
  142.                     iv4.setImageResource(R.drawable.yingying);  
  143.                     view = iv4;  
  144.                     break;  
  145.                 case 4:  
  146.                     ImageView iv5 = new ImageView(context);  
  147.                     iv5.setImageResource(R.drawable.nini);  
  148.                     view = iv5;  
  149.                     break;  
  150.             }  
  151.             return view;  
  152.          }  
  153.      }  
  154. }  

也可以动态加载布局文件也可以的:

在addCustomView()方法中这么写也是可以的:

  1. <span style="font-size:16px;">case 1:  
  2.     view = lInflater.inflate(R.layout.main, null);  
  3.     break;  
  4.   
  5. </span>  
图片就放你们喜欢的。。
14


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:209923次
    • 积分:3650
    • 等级:
    • 排名:第9885名
    • 原创:160篇
    • 转载:63篇
    • 译文:0篇
    • 评论:60条
    博客专栏
    文章分类
    最新评论