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

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

4. 具有弹性的ListView:

效果图:

主要代码:

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

测试代码:

[java] view plaincopy
  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. listView = (ElasticListView) findViewById(R.id.listview);
  8. String[] listValues = new String[20];
  9. for (int i=0;i<listValues.length;i++) {
  10. listValues[i] = "TextView" + i;
  11. }
  12. listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listValues));
  13. }
  14. }
[html] view plaincopy
  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. listView = (ElasticListView) findViewById(R.id.listview);
  8. String[] listValues = new String[20];
  9. for (int i=0;i<listValues.length;i++) {
  10. listValues[i] = "TextView" + i;
  11. }
  12. listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listValues));
  13. }
  14. }

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 plaincopy
  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 plaincopy
  1. minInstance = ViewConfiguration.get(this).getScaledTouchSlop();
4. 由上面的第三步可以看出,要判断其滑动,或者根据其需要上下的滑动来显示或者隐藏 ListView 顶部的布局都需要滑动监听事件,可以使用 OnTouchListener 接口来完成。在该接口重写的 onTouch() 方法中来获取滑动的坐标,并根据坐标差来判断 ListView 的滑动方向。
5. 由于需要根据 ListView 的滑动方向来显示或者隐藏其顶部的布局,所以其顶部的布局需要有显示或者隐藏的动画效果,可以使用 ObjectAnimator 来实现。关于 ObjectAnimator 在前面的博客中有所使用。
6. 当然了要实现该效果还需要在布局文件中让一个组件至于 ListView 上才行,布局文件代码:
activity_main.xml ;
[html] view plaincopy
  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. <ListView
  6. android:id="@+id/list_view"
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent"/>
  9. <android.support.v7.widget.Toolbar
  10. android:id="@+id/toolbar"
  11. android:background="@android:color/holo_blue_dark"
  12. android:layout_width="match_parent"
  13. android:layout_height="wrap_content"/>
  14. </RelativeLayout>
完整的 MainActivity.java 的代码:
[java] view plaincopy
  1. package com.crazy.showlistview;
  2. import android.animation.ObjectAnimator;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.os.Bundle;
  5. import android.support.v7.widget.Toolbar;
  6. import android.view.MotionEvent;
  7. import android.view.View;
  8. import android.view.ViewConfiguration;
  9. import android.view.ViewGroup;
  10. import android.widget.AbsListView;
  11. import android.widget.ArrayAdapter;
  12. import android.widget.ListView;
  13. public class MainActivity extends AppCompatActivity {
  14. private ListView mListView;
  15. private Toolbar mToolbar;
  16. // 最小滑动距离
  17. private int minInstance;
  18. // 记录开始位置
  19. private float mFirstY;
  20. // 当前位置
  21. private float mCurrentY;
  22. // 滑动的两种状态( 0 向下, 1 向上)
  23. private int status;
  24. private boolean mShow = true;
  25. private ObjectAnimator animator;
  26. @Override
  27. protected void onCreate(Bundle savedInstanceState) {
  28. super.onCreate(savedInstanceState);
  29. setContentView(R.layout.activity_main);
  30. init();
  31. scrollListViewEvent();
  32. }
  33. private void init() {
  34. String[] strings = new String[20];
  35. int length = strings.length;
  36. for (int i = 0; i < length; i++) {
  37. strings[i] = "数据:" + i;
  38. }
  39. mListView = (ListView)findViewById(R.id.list_view);
  40. mToolbar = (Toolbar)findViewById(R.id.toolbar);
  41. // 给 ListView 添加一个 HeaderView
  42. View header = new View(this);
  43. header.setLayoutParams(new AbsListView.LayoutParams(
  44. ViewGroup.LayoutParams.MATCH_PARENT,
  45. // 高度根据屏幕不一样,大小不一
  46. // (此处可以使用 R.dimen.abc_action_bar_default_height_material)
  47. (int) getResources().getDimension(
  48. R.dimen.abc_action_bar_default_height_material)));
  49. mListView.addHeaderView(header);
  50. mListView.setAdapter(new ArrayAdapter<>(this,
  51. android.R.layout.simple_list_item_1, strings));
  52. minInstance = ViewConfiguration.get(this).getScaledTouchSlop();
  53. }
  54. private void scrollListViewEvent(){
  55. mListView.setOnTouchListener(new View.OnTouchListener() {
  56. @Override
  57. public boolean onTouch(View v, MotionEvent event) {
  58. switch (event.getAction()) {
  59. case MotionEvent.ACTION_DOWN:
  60. mFirstY = event.getY();
  61. break;
  62. case MotionEvent.ACTION_MOVE:
  63. mCurrentY = event.getY();
  64. if (mCurrentY - mFirstY > minInstance) {
  65. status = 0;  // 向下
  66. } else {
  67. status = 1;  // 向上
  68. }
  69. if (status == 1) {
  70. if (mShow) {
  71. toolbarAnim(1);  // 隐藏
  72. mShow = false;
  73. }
  74. } else {
  75. if (!mShow) {
  76. toolbarAnim(0); // 显示
  77. mShow = true;
  78. }
  79. }
  80. break;
  81. }
  82. return false;
  83. }
  84. });
  85. }
  86. private void toolbarAnim(int i) {
  87. if (animator != null && animator.isRunning()) animator.cancel();
  88. if (i == 0)
  89. animator = ObjectAnimator.ofFloat(
  90. mToolbar,
  91. "translationY",
  92. mToolbar.getTranslationY(),
  93. 0);
  94. else
  95. animator = ObjectAnimator.ofFloat(
  96. mToolbar,
  97. "translationY",
  98. mToolbar.getTranslationY(),
  99. -mToolbar.getHeight());
  100. animator.start();
  101. }
  102. }

6. ListView实现聊天:
下载地址:http://download.csdn.net/detail/shenggaofei/9615547

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

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

先附上最终的代码:

[java] view plaincopy
  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. chatlist.setAdapter(new ChatAdapter(TryChatPop2Activity.this,list));
  13. }

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

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

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

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

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

  1. <span style="font-size:16px;">case 1:
  2. view = lInflater.inflate(R.layout.main, null);
  3. break;
  4. </span>

图片就放你们喜欢的。。

14

最全ListView扩展的实例和补充相关推荐

  1. python 元类的call_python3 全栈开发 - 内置函数补充, 反射, 元类,__str__,__del__,exec,type,__call__方法...

    python3 全栈开发 - 内置函数补充, 反射, 元类,__str__,__del__,exec,type,__call__方法 一, 内置函数补充 1,isinstance(obj,cls)检查 ...

  2. 一个全屏页面切换实例

    这里写了一个全屏切换的实例,纯手工,没有使用任何插件~ <!DOCTYPE html> <html lang="zh-CN"> <head> & ...

  3. php开启sockets模块,linux下开启php的sockets扩展支持实例

    下个相同版本的php源码,进行编译安装,再按照上面步骤搞,生成的so.copy到rpm装的那个,修改php.ini进行扩展就行了, 或者到网上找相同版本,相同系统 的编译好的so文件. 在linux下 ...

  4. typec扩展坞hdmi没反应_全功能扩展坞Type-C Docking (扩展坞) 方案讲解-可实现拔插不掉屏...

    Dock,又叫做扩展坞,这类产品的流行是因为笔记本电脑的USB或者视频等接口数量有限,用户希望扩展出更多数量的或者更多种类的接口,来满足多元应用需求.由于笔记本接口输出功率的限制,扩展坞通常需要通过自 ...

  5. 【Groovy】Groovy 扩展方法 ( 实例扩展方法配置 | 扩展方法示例 | 编译实例扩展类 | 打包实例扩展类字节码到 jar 包中 | 测试使用 Thread 实例扩展方法 )

    文章目录 一.扩展方法示例 二.实例扩展方法配置 三.编译实例扩展类 四.打包静态扩展类字节码到 jar 包中 五.测试使用 Thread 实例扩展方法 一.扩展方法示例 为 Thread 扩展 he ...

  6. Android ListView性能优化实例讲解

    前言: 对于ListView,大家绝对都不会陌生,只要是做过Android开发的人,哪有不用ListView的呢? 只要是用过ListView的人,哪有不关心对它性能优化的呢? 关于如何对ListVi ...

  7. catia知识工程_【开团】CATIA超全直播课程&实例讲解!

    为了广大盟友的学习需求 我们特别为盟友们准备这次 "超值.超全.超量" 的CATIA全面直播课 更是业界大牛:小狼老师 全程授课! 越多报名! 越多优惠! (开团人数只要达到折扣要 ...

  8. axure实现复选框全选_Axure RP实例教程:全选与取消全选效果

    原标题:Axure RP实例教程:全选与取消全选效果 Axure RP 9 Mac这款原型设计软件能让设计者快速创建应用软件,或者在web网站的线框图.流程图.原型和规格的设计制作,从低到高的视觉和交 ...

  9. php mhash,PHP加密扩展库-Mhash扩展库实例用法详解

    PHP加密扩展库-Mhash扩展库 什么是Mhash扩展库:Mhash是基于离散数学原理的不可逆向的php加密方式扩展库,其在默认情况下不开启.mhash的可以用于创建校验数值,消息摘要,消息认证码, ...

  10. android listview 自定义控件,Android 自定义弹性ListView控件实例代码(三种方法)

    关于在Android中实现ListView的弹性效果,有很多不同的方法,网上一搜,也有很多,下面贴出在项目中经常用到的两种实现ListView弹性效果的方法(基本上拿来就可以用),供大家参考: 弹性L ...

最新文章

  1. shell脚本编程基础(1)及RAID阵列
  2. AI产品之路:神经元与神经网络
  3. Windows环境下配置php的curl扩展
  4. 来谈谈JAVA面向对象 - 鲁班即将五杀,大乔送他回家??
  5. (原創) 如何使用Operator Overloading? (C/C++)
  6. 在React中加载数据:redux-thunk,redux-saga,suspense,hooks
  7. iView学习笔记(四):Form表单操作
  8. Latex参考文献引用格式,期刊参考文献引用格式注意事项
  9. 松下FPX通用通信编程实例
  10. Paper和陈丹琦撞车是一种怎样的体验
  11. 供应链金融系统建设的具体实施步骤
  12. H5+CSS+JavaScript入门学习
  13. pytorch学习随手记
  14. 帆软注册文件_报表组件FineReport加密狗注册机理及使用方法
  15. Python与数据分析
  16. 解决一直Gradle Build Running的问题
  17. 清晰的理解大端和小端
  18. 使用cdrecord命令刻录光盘
  19. 洛谷 P5594 【XR-4】模拟赛 视频讲解(二维数组、模拟)
  20. 泛函分析笔记06:Lp与lp空间

热门文章

  1. 大数据人工智能行业技术图谱
  2. linux安装ms字体
  3. 数字人正走进现实!AI大脑+高颜值
  4. 天正菜单栏不见了怎么显示出来_天正建筑菜单栏不见了怎么调出来
  5. 清、浊、爆破音的时域与频域特性
  6. 沪深证券交易机制概述
  7. 用xcode写java_xcode怎么写java
  8. mysql数据库,语法语句总结。以及事务理解-基础篇
  9. 2008服务器远程桌面连接设置密码,WinServer 2008 远程桌面连接设置
  10. 如何看待”日光之下,并无新事“