HardBirch

Android入门第七篇之ListView (二)

时间:09-09-13 栏目:安卓入门与提高 作者:张飞不张,文采横飞 评论:93 点击: 28,160 次

       Android入门第六篇之ListView (一) ,讲的是如何制作一个具有两行文本的 自定义控件 ,作为ListView的Item的使用方法。这篇接下来也是围绕ListView和Item,更加深入地介绍它们的用法。

       首先,先来看看本文代码运行的结果,本文的Item比上一篇中的Item多出左边的图标:


 


      main.xml的源代码,跟上一篇的一样,这里就不作解释了,直接贴出item.xml的代码,就是它实现ImageItem的UI:
























      解释一下 item.xml的代码:这里使用了RelativeLayout布局,控件的关键的属性是:

itemTitle的属性 android:layout_toRightOf="@+id/itemImage" ,itemTitle在itemImage的右边;

itemText的属性 android:layout_toRightOf="@+id/itemImage",ItemText在itemImage的右边, android:layout_below="@+id/itemTitle", itemText 在 itemTitle的下面。

       最后,贴出JAVA的源代码,其中重点是LayoutInflate的用法。LayoutInflate的使用方法如下: 

  • LayoutInflater的作用是,把一个View的对象与XML布局文件关联并实例化。
  • View的对象实例化之后,可以通过findViewById()查找布局文件中的指定Id的组件。

 

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class testListView extends Activity {
ListView listView;
String[] titles={"标题1","标题2","标题3","标题4"};
String[] texts={"文本内容A","文本内容B","文本内容C","文本内容D"};
int[] resIds={R.drawable.icon,R.drawable.icon,R.drawable.icon,R.drawable.icon};

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.setTitle("BaseAdapter for ListView");
listView=(ListView)this.findViewById(R.id.listView1);
listView.setAdapter(new ListViewAdapter(titles,texts,resIds));
}

public class ListViewAdapter extends BaseAdapter {
View[] itemViews;

public ListViewAdapter(String[] itemTitles, String[] itemTexts,
int[] itemImageRes) {
itemViews = new View[itemTitles.length];

for (int i = 0; i < itemViews.length; i++) {
itemViews[i] = makeItemView(itemTitles[i], itemTexts[i],
itemImageRes[i]);
}
}

public int getCount() {
return itemViews.length;
}

public View getItem(int position) {
return itemViews[position];
}

public long getItemId(int position) {
return position;
}

private View makeItemView(String strTitle, String strText, int resId) {
LayoutInflater inflater = (LayoutInflater) testListView.this
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

// 使用View的对象itemView与R.layout.item关联
View itemView = inflater.inflate(R.layout.item, null);

// 通过findViewById()方法实例R.layout.item内各组件
TextView title = (TextView) itemView.findViewById(R.id.itemTitle);
title.setText(strTitle);
TextView text = (TextView) itemView.findViewById(R.id.itemText);
text.setText(strText);
ImageView image = (ImageView) itemView.findViewById(R.id.itemImage);
image.setImageResource(resId);

return itemView;
}

public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null)
return itemViews[position];
return convertView;
}
}

}

声明: 本文由( 张飞不张,文采横飞 )原创编译,转载请保留链接: Android入门第七篇之ListView (二)

Android入门第七篇之ListView (二):目前有93 条留言

  1. 0楼
    lijingyu:

    太牛了,顶上,学习…………….

    2009-09-15 18:24 [回复]
  2. 0楼
    lijingyu:

    请问在以上JAVA文件中如何设置listview的点击事件使每一个选项分别换到下一个页面?谢谢

    2009-09-16 19:44 [回复]
  3. 0楼
    metababy:

    [e10]

    2010-01-21 15:34 [回复]
  4. 0楼
    metababy:

    Android开发类文章,多多益善

    2010-01-21 15:34 [回复]
  5. 不错,还有个疑问
    ListView有没有居中功能,让Item中的内容居中

    2010-02-05 00:17 [回复]
  6. 0楼
    hellogv:

    回复 bq315505460:
    ListView的宽度就是Item的宽度,直接让Item的文字居中就行了

    2010-02-05 08:58 [回复]
  7. 回复 hellogv:Item中同时有ImageView 和TextView时怎么弄

    2010-02-05 10:30 [回复]
  8. 0楼
    cxmsee:

    博主你好,向您请教一个问题:
    我的list item里面包含一个CheckBox, 而在那个ArrayList数据里面会为每个list item记录CheckBox的状态(true/false)。
    我现在的问题是,我每次点击这个CheckBox使其状态改变时,怎么去更新我的ArrayList数据,我可以实现这个CheckBox的onCheckedChanged()函数,可是我没办法在这个函数中取得ArryList的索引,也就是这个list item的索引值。

    不胜感激

    2010-03-06 13:02 [回复]
  9. 0楼
    hellogv:

    回复 cxmsee:
    在每个CheckBox的标题加入序号,每次onCheckedChanged()函数调用时,就读取自身的标题,从而判断是哪个被触发了。

    2010-03-06 21:31 [回复]
  10. 0楼
    cxmsee:

    回复 hellogv:谢谢回复,您是说给CheckBox加上标号放到它的Text里面么? 可这样就把标号显示出来了啊

    2010-03-07 13:19 [回复]
  11. 我想改变 其中满足条件的items的字体颜色 怎么弄啊
    比如说:item中一个值大于零时 需让整个item的字体颜色变成红色

    非常感谢!!!

    2010-03-11 10:06 [回复]
  12. 0楼
    lwwit:

    study

    2010-04-20 19:56 [回复]
  13. 0楼
    wsndbd:

    非常那个相录的感谢

    2010-07-12 15:57 [回复]
  14. 0楼
    yuanxiaowu:

    好呀,学习喽!!

    2010-09-11 19:19 [回复]
  15. 0楼
    cuiquanmao:

    [e01]

    2010-09-30 14:40 [回复]
  16. 0楼
    GMstart:

    [e01]

    2010-10-28 11:00 [回复]
  17. 0楼
    freemancy:

    很好.谢谢了..[e01][e01][e01][e01][e01][e01][e01][e01][e01][e01][e01][e01][e01]

    2010-11-07 00:54 [回复]
  18. [e01]

    2010-11-09 13:32 [回复]
  19. 0楼
    favory:

    [e01]啥时开始学习Android啦!不错!

    2010-11-16 16:23 [回复]
  20. 0楼
    interfacer:

    天天都来学习学习 顶顶[e03]

    2010-12-10 11:32 [回复]
  21. 0楼
    lqz1988:

    顶一下,非常适合我,初学者

    2011-01-06 13:55 [回复]
  22. 0楼
    jiasanshou:

    比ListActivity灵活些

    2011-01-11 09:57 [回复]
  23. [e01]

    2011-03-10 20:13 [回复]
  24. 纠正一下代码中的一个错误,引用控件的时候是&quot;@id/itemImage&quot;而不是&quot;@+id/itemImage&quot;,所以代码中的android:layout_toRightOf=&quot;@+id/itemImage&quot;应该改为android:layout_toRightOf=&quot;@id/itemImage&quot;

    2011-04-12 11:26 [回复]
  25. 0楼
    user_liu:

    我学习android的第一手教程就选你的了[e03]

    2011-04-13 14:34 [回复]
  26. [e01]

    2011-04-14 16:30 [回复]
  27. 0楼
    ttmxh:

    [e01]发现item的个数多到需要翻屏的话搓动会有问题额,不知怎么解决?

    2011-05-10 10:48 [回复]
  28. 0楼
    hellogv:

    回复 ttmxh:
    public View getView(int position, View convertView, ViewGroup parent) {
    return itemViews[position];
    }

    试试用这个

    2011-05-10 10:59 [回复]
  29. 0楼
    yujianmumu:

    博主,每次 new ListViewAdapter()时会创建每个Item的,多的时候不怕内存溢出吗?

    2011-05-11 11:56 [回复]
  30. 0楼
    hellogv:

    回复 yujianmumu:
    这个例子适合数量少的Item,数量多的时候,用分页吧,用户也不可能一拖到底。

    2011-05-11 13:21 [回复]
  31. 0楼
    gnoynehc:

    // 使用View的对象itemView与R.layout.item关联
    View itemView = inflater.inflate(R.layout.item, null);

    上面这个R.layout.item从哪里来的呢?

    2011-05-13 14:36 [回复]
  32. 0楼
    gnoynehc:

    应是对应item.xml这个布局吧

    2011-05-13 14:49 [回复]
  33. 0楼
    ttmxh:

    回复 hellogv:改成这样就没问题了,谢谢

    2011-05-17 00:48 [回复]
  34. [e09]

    2011-05-31 11:38 [回复]
  35. [e10]

    2011-05-31 11:42 [回复]
  36. 0楼
    fogelory:

    ListView list = (ListView)findViewById(R.id.listview);
    这句报错:
    Cannot cast from View to ListView
    为什么啊

    2011-06-14 16:52 [回复]
  37. 0楼
    fogelory:

    回复 fogelory:
    我错了,我项目名称就叫ListView,可能命名空间冲突了

    2011-06-14 17:03 [回复]
  38. 0楼
    tcs517:

    博主。请问。我复制了你的代码。报错2处:
    1. listView=(ListView)this.findViewById(R.id.listView1);

    2..// 使用View的对象itemView与R.layout.item关联
    View itemView = inflater.inflate(R.layout.item, null);

    求解决。我自己搞不懂。能解释下嘛?

    2011-07-11 21:08 [回复]
  39. 0楼
    eagle1597:

    [reply]cxmsee[/reply]
    可以用view的setTag(Object tag)功能作一个标签即可。

    2011-07-18 16:39 [回复]
  40. 0楼
    sserf:

    找了好久,终于找到了这里!

    2011-07-20 15:33 [回复]
  41. 0楼
    hellogv:

    [reply]tcs517[/reply]
    请看看自己的控件名称和layout有没有写错

    2011-07-20 19:04 [回复]
  42. 0楼
    yjy951753:

    发现 View itemView = inflater.inflate(R.layout.item, null); 并没有把当前布局设为R.layout.item,用findviewbyid时候还是返回空的,求解。。。谢谢

    2011-08-03 15:02 [回复]
  43. 0楼
    yjy951753:

    [reply]yjy951753[/reply]
    找到错误了。。。发现findviewbyid前没有加上itemView。。。

    2011-08-03 15:13 [回复]
  44. 能实现,当你点击一个itme时会展开这个itme的详细信息吗?

    2011-08-08 18:29 [回复]
  45. 0楼
    hellogv:

    [reply]fendyibaidutv[/reply]
    信息最好存到Adapter里面

    2011-08-09 21:00 [回复]
  46. 0楼
    pokalu:

    求问。listview只是存储标题,但是长篇内容还得放另一个activity。请问怎么传递id过去,来获取新闻内容呢。

    2011-08-17 16:19 [回复]
  47. 0楼
    hellogv:

    [reply]pokalu[/reply]
    就普通的activity跳转来传递啊

    2011-08-17 18:34 [回复]
  48. 你好。我用你的方法画ListView.每一次画的位置都不确定。例如,我修改ListView中的某一项,然后又重新画整个ListView,但是它并不是按之前定义好的数组的顺序来画每一行的,难道ListView会自动排序吗?
    还有就是你把getView的大部分操作放到构造函数中,如果画的多了,会不会影响性能?

    2011-08-24 16:52 [回复]
  49. 0楼
    hellogv:

    [reply]ZFZF294990051[/reply]
    ListView默认用HashTable,我有一片是针对平板优化的ListView/GridView优化文章,你可以去看看,这个例子只是演示如何使用ListView而已

    2011-08-24 18:34 [回复]
  50. 0楼
    hellogv:

    [reply]cxmsee[/reply]
    你可以在Adapter里面建立一个跟ListView一一对应的映射表

    2011-08-24 18:35 [回复]
  51. 0楼
    bearray123:

    为什么不把 ListView 标签 和 TextView 标签放一个XMl文件里面啊。。直接把TextView嵌套到ListView里面啊

    2011-09-09 10:54 [回复]
  52. 0楼
    hellogv:

    [reply]bearray123[/reply]
    ListView形态多变,以后做多点项目,慢慢就会发现ListView与Adapter的巧妙配合了

    2011-09-10 11:42 [回复]
  53. 不明白为什么在初始化adapter的时候就把所有的item给创建出来,个人觉得这种适合比较少而且item内容固定的时候用,不知道博主这样有什么好处?

    2011-09-19 14:21 [回复]
  54. 0楼
    hellogv:

    [reply]bingtao_bit[/reply]
    数量少的Item才用这种类型的adpter,实际项目中,是必须继承BaseAdapter来扩展的

    2011-09-19 14:22 [回复]
  55. 期待你的listview item网络取图片的优化 文章。最近在搞这个。呵呵

    2011-09-28 11:03 [回复]
  56. [reply]hellogv[/reply]
    才疏学浅 请问你那个映射表能解释清楚点吗?

    2011-09-28 18:00 [回复]
  57. 0楼
    hellogv:

    [reply]yuboxin5566[/reply]
    listview item的优化不用搞把,这个用setTag那个方法就够了

    2011-09-28 18:58 [回复]
  58. 加载的时候显示很慢的啊。我用的是ViewHolder。但设置断点在returnBitMap这个方法下反复加载网络图片的地址,怎么回事呢?我把图片地址存在mysql,加载的时候取出来放到returnBitmap方法下面。。

    2011-09-29 10:50 [回复]
  59. 0楼
    anzhu_111:

    我用博主的方法弄得,效果实现了,就是数据量大的时候,上下滑动,有的时候会出现行和行堆叠的情况,这是为啥呢?

    2011-11-09 10:52 [回复]
  60. 0楼
    hellogv:

    [reply]anzhu_111[/reply]
    卡,这时候要做优化了

    2011-11-09 23:17 [回复]
  61. 0楼
    springge:

    [reply]yjy951753[/reply]
    你比我好多了,我启动直接报错,内牛满面呀

    2011-11-16 17:44 [回复]
  62. 0楼
    hellogv:

    [reply]hellogv[/reply]
    returnBitMap。。。。这个是什么?本文么有出现。。。

    2011-11-16 22:29 [回复]
  63. 0楼
    kandy555:

    学习了。。。很有帮助。

    2011-11-22 16:52 [回复]
  64. 0楼
    sdmjhca:

    看了这么多了,我想向楼主借鉴下学习Andriod的经验,这些代码勉强能看懂,但肯定记不住,不知楼主是怎么学的,就可以写出这些代码,需要记住这些代码么????????期望楼主指导

    2011-11-29 17:14 [回复]
  65. 0楼
    caicai223:

    顶啊。。。

    2011-11-30 20:26 [回复]
  66. 0楼
    hellogv:

    [reply]sdmjhca[/reply]
    兄弟,写代码不能靠背,把常用代码构建成自己的类库,以后复制黏贴就行了

    2011-12-02 13:29 [回复]
  67. 0楼
    fjzzy5566:

    楼主,我想问如果我想写个什么都没有的列表还能用android自带的列表控件吗,就是只有个列表,但是列表信息是空的,而且可以用相对布局在它的右边加入几个控件吗,谢谢

    2011-12-03 15:48 [回复]
  68. 0楼
    hellogv:

    [reply]fjzzy5566[/reply]
    为什么要这样做呢。。。。

    2011-12-03 22:50 [回复]
  69. 0楼
    zhengliusu:

    好久没人来了,给你顶一下,谢谢你的资料!!!

    2011-12-31 12:46 [回复]
  70. 0楼
    justdo2008:

    LZ方便提供源码?

    2012-01-14 17:54 [回复]
  71. 0楼
    hellogv:

    [reply]justdo2008[/reply]
    代码都已经贴出来了啊。。。。

    2012-01-15 15:10 [回复]
  72. 0楼
    yeahwell:

    慢慢的有点上手了

    2012-01-25 12:22 [回复]
  73. 0楼
    zgzhaobo:

    [reply]hellogv[/reply]
    您好,请问如何构建自己的类库,能否简单举一例子?谢谢! (android初学者借鉴前辈经验)
    zgzhaobo@gmail.com

    2012-02-14 20:14 [回复]
  74. listView.setAdapter(new ListViewAdapter(titles,texts,resIds))
    里边ListViewAdapter是自定义的,setAdapter怎么能分辨出这个类里有自己需要的东西

    2012-03-06 22:05 [回复]
  75. 0楼
    hellogv:

    [reply]csf993981061[/reply]
    getView()

    2012-03-07 00:05 [回复]
  76. 借鉴过来,挺详细的

    2012-03-12 15:00 [回复]
  77. 0楼
    wrdswa:

    顶楼主

    2012-04-09 20:12 [回复]
  78. 0楼
    mdltsy:

    android:paddingBottom="4dip"
    07. android:paddingLeft="12dip">
    楼主 这个啥意思 我看不懂

    2012-05-05 21:28 [回复]
  79. 0楼
    mdltsy:

    楼主 我是刚开始学android 我想问下 我应该学些啥 杂学 我现在就过能看些代码 但是让我自己写就不会写了

    2012-05-05 21:30 [回复]
  80. 0楼
    mdltsy:

    item.xml 这个配置文件在哪个文件夹放

    2012-05-05 22:20 [回复]
  81. [reply]mdltsy[/reply]
    res/layout/

    2012-05-07 16:25 [回复]
  82. 0楼
    mdltsy:

    listView=(ListView)this.findViewById(R.id.listView1);中listView1这个有错误 咋办

    2012-05-09 22:48 [回复]
  83. 0楼
    hellogv:

    [reply]mdltsy[/reply]
    没有这个id

    2012-05-10 07:52 [回复]
  84. 0楼
    mdltsy:

    R.drawable.icon
    这个报错 咋回事

    2012-05-10 18:56 [回复]
  85. 0楼
    mdltsy:

    {R.drawable.icon 中 icon报错
    icon cannot be resolved or is not a field

    2012-05-11 10:14 [回复]
  86. 0楼
    zzpxingfu:

    hellogv ,你好:
    我这遇到了一个比较奇怪的情况,根据你的代码我在我的机器上实现了一下,竖排显示没问题,包括滚动什么的都没问题。
    但是横排先的时候出现了问题!情况如下:
    1.列表顺序为1.2.3.4.5.6.7.8.9.。。。。
    2.在横排的时候,如果以滚动,顺序就会乱了。会成为如下的情况:
    2.3.4.5.1.7.2.3.
    7.8.9.12.3.7.8.9
    这就成这种情况,如果在转回竖排,顺序还会在回来1.2.3.4.5.6.7.8.。
    本来想截图,但是我的是g11 s-no 暂时获取不了root权限。我发截图。求解!谢谢!

    2012-05-31 22:37 [回复]
  87. 0楼
    zzpxingfu:

    [reply]zzpxingfu[/reply]
    无法截图

    2012-05-31 22:38 [回复]
  88. listView=(ListView)this.findViewById(R.id.listView1); listView1这里报错。。有没有源码啊。。你在Item.xml里没设置这个id啊

    2012-07-17 14:58 [回复]
  89. 0楼
    bogongjie:

    [reply]qq272803220[/reply]
    這個需要在main中定義個listview, id為listview1

    2012-07-17 17:40 [回复]
  90. 楼主,你好。我想请教一下在构造函数里new一个view比起在getItem方法返回titles[position]有什么好处?我这样的:
    public ListViewAdapter(Context con, String[] titles, String[] texts,int[] picId) {
    this.con = con;
    this.titles = titles;
    this.texts = texts;
    this.picId = picId;
    }
    public int getCount() {
    return titles.length;}
    public Object getItem(int position) {
    return titles[position];}
    public long getItemId(int position) {
    return position;}
    public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater factory = LayoutInflater.from(con);
    View v = factory.inflate(R.layout.item, null);
    TextView title = (TextView) v.findViewById(R.id.itemTitle);
    title.setText(titles[position]);
    TextView text = (TextView) v.findViewById(R.id.itemText);
    text.setText(texts[position]);
    ImageView image = (ImageView) v.findViewById(R.id.itemImage);
    image.setImageResource(picId[position]);
    return v;
    }。谢谢!

    2012-08-08 15:32 [回复]
  91. 不好意思,上一个问题问的有点模糊,就是想问继承类里面的getItem方法和getItemId方法是干啥用的?

    2012-08-08 16:13 [回复]
  92. 请问在这段代码中LayoutInflater inflater = (LayoutInflater) testListView.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 为什么会出现No enclosing instance of the type ShangjiActivity.testListView is accessible in scope错误呢?求指教啊·····

    2012-08-14 22:50 [回复]
  93. 学习了。

    2012-10-09 14:28 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐