最近做了一个“csdn专家博客App” 当然了是android版本,在专家浏览页面,我才用了expandablelistview 组件来显示专家分类,每个分类点击之后可以显示专家的头像和名字。

很简单一个功能,先看效果图:

结果发现一个问题,就是每个分类里的数据存在重复插入好几次的现象;

ExpertGridAdapter.java  gridview的adapter

  1. public class ExpertGridAdapter extends BaseAdapter {
  2. private LayoutInflater inflater;
  3. private CsBlogger[] datals;
  4. private Context mContext;
  5. private String TAG="ExpertGridAdapter";
  6. public ExpertGridAdapter(Context context,List<CsBlogger> childs) {
  7. this.inflater = LayoutInflater.from(context);
  8. datals=new CsBlogger[childs.size()];
  9. childs.toArray(datals);
  10. CsLog.d("maomao", "childs.size:"+childs.size());
  11. mContext=context;
  12. }
  13. @Override
  14. public int getCount() {
  15. return datals.length;
  16. }
  17. @Override
  18. public Object getItem(int position) {
  19. return datals[position];
  20. }
  21. @Override
  22. public long getItemId(int position) {
  23. return position;
  24. }
  25. @Override
  26. public View getView(int position, View convertView, ViewGroup parent) {
  27. ViewHolder holder;
  28. if (convertView==null) {
  29. holder=new ViewHolder();
  30. convertView=this.inflater.inflate(R.layout.csblog_expert_item_menu, null);
  31. holder.iv=(ImageView) convertView.findViewById(R.id.item_image);
  32. holder.tv=(TextView) convertView.findViewById(R.id.item_text);
  33. convertView.setTag(holder);
  34. }
  35. else {
  36. holder=(ViewHolder) convertView.getTag();
  37. }
  38. CsBlogger expert=datals[position];
  39. DisplayImageOptions options; // 显示图像设置
  40. ImageLoader imageLoader = ImageLoader.getInstance();// 得到图片加载器
  41. // 图片加载器初始化
  42. imageLoader.init(ImageLoaderConfiguration.createDefault(mContext));
  43. // 使用DisplayImageOptions.Builder()创建DisplayImageOptions
  44. options = new DisplayImageOptions.Builder()
  45. .showStubImage(R.drawable.blogger) // 设置图片下载期间显示的图片
  46. .showImageForEmptyUri(R.drawable.blogger) // 设置图片Uri为空或是错误的时候显示的图片
  47. .showImageOnFail(R.drawable.blogger) // 设置图片加载或解码过程中发生错误显示的图片
  48. .cacheInMemory() // 设置下载的图片是否缓存在内存中
  49. .cacheOnDisc() // 设置下载的图片是否缓存在SD卡中
  50. .displayer(new RoundedBitmapDisplayer(20)) // 设置成圆角图片
  51. .build(); // 创建配置过得DisplayImageOption对象
  52. // 异步加载图片  专家头像
  53. imageLoader
  54. .displayImage(expert.getUserface(),  holder.iv, options);
  55. holder.tv.setText(expert.getNickname());
  56. return convertView;
  57. }
  58. private class ViewHolder{
  59. ImageView iv;
  60. TextView tv;
  61. }
  62. }

ExpertsListViewAdapter.java  可扩展的listview

  1. public class ExpertsListViewAdapter extends BaseExpandableListAdapter implements
  2. OnItemClickListener
  3. {
  4. public static final int ItemHeight = 136;// 每项的高度
  5. public static final int PaddingLeft = 96;// 每项的高度
  6. private int myPaddingLeft = 0;
  7. private List<TreeNode> treeNodes = new ArrayList<TreeNode>();
  8. private Context parentContext;
  9. private LayoutInflater layoutInflater;
  10. public ExpertsListViewAdapter(Context view, int myPaddingLeft,List<TreeNode> treeNodes)
  11. {
  12. parentContext = view;
  13. this.myPaddingLeft = myPaddingLeft;
  14. this.treeNodes=treeNodes;
  15. }
  16. public void RemoveAll()
  17. {
  18. treeNodes.clear();
  19. }
  20. public CsBlogger getChild(int groupPosition, int childPosition)
  21. {
  22. return treeNodes.get(groupPosition).childs.get(childPosition);
  23. }
  24. @Override
  25. public int getChildrenCount(int groupPosition)
  26. {
  27. //return treeNodes.get(groupPosition).childs.size();
  28. //  返回值必须为1,否则会重复数据
  29. return 1;
  30. }
  31. public TextView getTextView(Context context)
  32. {
  33. AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
  34. ViewGroup.LayoutParams.FILL_PARENT, ItemHeight);
  35. TextView textView = new TextView(context);
  36. textView.setLayoutParams(lp);
  37. textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
  38. return textView;
  39. }
  40. class ExpandableListHolder {
  41. CsGridView grdiview;
  42. }
  43. private ExpertGridAdapter adatper;
  44. /**
  45. * 可自定义ExpandableListView
  46. */
  47. public View getChildView(int groupPosition, int childPosition,
  48. boolean isLastChild, View convertView, ViewGroup parent)
  49. {
  50. CsLog.d("maomao", "getChildView, groupPosition:"+groupPosition+",childs size:"+treeNodes.get(groupPosition).childs.size());
  51. //if (convertView == null)
  52. {
  53. CsLog.d("maomao", "converView is null");
  54. layoutInflater = (LayoutInflater) parentContext
  55. .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  56. convertView = layoutInflater.inflate(R.layout.csblog_expert_view, null);
  57. CsGridView toolbarGrid = (CsGridView) convertView
  58. .findViewById(R.id.GridView_toolbar);
  59. toolbarGrid.setNumColumns(4);// 设置每行列数
  60. toolbarGrid.setGravity(Gravity.CENTER);// 位置居中
  61. toolbarGrid.setHorizontalSpacing(10);// 水平间隔
  62. adatper=new ExpertGridAdapter(parentContext,treeNodes.get(groupPosition).childs);
  63. toolbarGrid.setAdapter(adatper);// 设置菜单Adapter
  64. toolbarGrid.setOnItemClickListener(this);
  65. adatper.notifyDataSetChanged();
  66. }
  67. //else{
  68. //  CsLog.d("maomao", "convertView!=null");
  69. //}
  70. return convertView;
  71. }
  72. /**
  73. * 可自定义list
  74. */
  75. public View getGroupView(int groupPosition, boolean isExpanded,
  76. View convertView, ViewGroup parent)
  77. {
  78. TextView textView = getTextView(this.parentContext);
  79. String gname=getGroup(groupPosition).toString()+"("+treeNodes.get(groupPosition).childs.size()+")";
  80. textView.setText(gname);
  81. textView.setPadding(myPaddingLeft + PaddingLeft, 0, 0, 0);
  82. return textView;
  83. }
  84. public long getChildId(int groupPosition, int childPosition)
  85. {
  86. return childPosition;
  87. }
  88. public Object getGroup(int groupPosition)
  89. {
  90. return treeNodes.get(groupPosition).parent;
  91. }
  92. public int getGroupCount()
  93. {
  94. return treeNodes.size();
  95. }
  96. public long getGroupId(int groupPosition)
  97. {
  98. return groupPosition;
  99. }
  100. public boolean isChildSelectable(int groupPosition, int childPosition)
  101. {
  102. return true;
  103. }
  104. public boolean hasStableIds() {
  105. return true;
  106. }
  107. @Override
  108. public void onItemClick(AdapterView<?> parent, View view, int position,
  109. long id)
  110. {
  111. Toast.makeText(parentContext, "当前选中的是:" + position, Toast.LENGTH_SHORT)
  112. .show();
  113. }
  114. }

大家注意这个方法,知道这两种写法的区别吗? 当然 return1 ,就可以得到上面截图的效果。

  1. @Override
  2. public int getChildrenCount(int groupPosition)
  3. {
  4. //return treeNodes.get(groupPosition).childs.size();
  5. //  返回值必须为1,否则会重复数据
  6. return 1;
  7. }
    • 加入CSDN技术群:221057495 与我交流

解决android expandablelistview 里面嵌入gridview行数据重复问题的更多相关文章

  1. 缓存AsimpleCache -- 解决Android中Sharedpreferences无法存储List数据/ASimpleCache

    Sharedpreferences想必大家在项目中都经常会用到,但是如果需要在本地需要存储比较多的数据,存储一个集合的时,发现Sharedpreferences并不 是那么好使了. 分析 如果需要在本 ...

  2. [Jacky] 解决Ext.Net GridPanel 选择的行数据刷新后不能获取最新值

    选择GridPanel中一行数据,当变更数据时并重新刷新之后不能获取最新值,需通过如下方式获取: var internalId = gridPanel.getSelectionModel().getL ...

  3. 解决Android与服务器交互大容量数据问题

    对于目前的状况来说,移动终端的网络状况没有PC网络状况那么理想.在一个Android应用中,如果需要接收来自服务器的大容量数据,那么就不得不考虑客户的流量问题.本文根据笔者的一个项目实战经验出发,解决 ...

  4. 转载 解决Android与服务器交互大容量数据问题

    对于目前的状况来说,移动终端的网络状况没有PC网络状况那么理想.在一个Android应用中,如果需要接收来自服务器的大容量数据,那么就不得不考虑客户的流量问题.本文根据笔者的一个项目实战经验出发,解决 ...

  5. ASP.NET 使用AJAX让GridView的数据行显示提示框(ToolTip)

    介绍ASP.NET AJAX可以使你的web应用程序具有更丰富的功能和更多的用户响应. 本文中,我将演示如何通过ASP.NET AJAX的帮助,给像GridView这样的数据绑定控件的数据行增加pop ...

  6. 在用easyui中做CRUD功能时,当删除一行或多行数据后再点击修改会提示你选中了多行,如何解决这个bug了?

    在用easyui中做CRUD功能时,当删除一行或多行数据后再点击修改会提示你选中了多行,如何解决这个bug了? 在删除成功后,加上这句话就可以了:$("#dg").datagrid ...

  7. GridView中数据行的操作

    一个是直接动态绑定gridview 用3楼的办法就可以了 int j=1;//j的数值表示你要取的那一列的索引,要取第二列,j就设为1for (int i = 0; i < this.GridV ...

  8. Android——MeasureSpec学习 - 解决ScrollView嵌套ListView和GridView冲突的方法

      原文地址:http://blog.csdn.net/yuhailong626/article/details/20639217   在自定义View和ViewGroup的时候,我们经常会遇到int ...

  9. PB笔记之第一行数据不能删除的解决方法

    如果第一行数据不能删除,则单独写SQL进行删除 window lw_sheet //dw_1.event pfc_deleterow()long i String ls_manidInteger ls ...

随机推荐

  1. ACM/ICPC 之 DFS求解欧拉通路路径(POJ2337)

    判断是欧拉通路后,DFS简单剪枝求解字典序最小的欧拉通路路径 //Time:16Ms Memory:228K #include<iostream> #include<cstring& ...

  2. Dnsmasq安装与配置-搭建本地DNS服务器 更干净更快无广告DNS解析

    默认的情况下,我们平时上网用的本地DNS服务器都是使用电信或者联通的,但是这样也导致了不少的问题,首当其冲的就是上网时经常莫名地弹出广告,或者莫名的流量被消耗掉导致网速变慢.其次是部分网站域名不能正常 ...

  3. Meta标签实现阻止移动设备(手机、Pad)的浏览器双击放大网页

    一.背景 在当今这个移动设备发展越来越快,并且技术越来越成熟的时代,移动设备成了企业扩展业务不可或缺的重要领域之一,随之而来的是适应手机的网站层出不穷,在开发过程中,我们往往会遇到一个很尴尬的问题:移 ...

  4. Ubuntu离线更新flashplugin

    当网络太烂时,Ubuntu更新可能会卡在下载flashplugin上面,继而出错.在U论坛上找到一篇帖子,寻到成功安装flashplugin-installer的方法: 1.首先使用sudo apt- ...

  5. android的JNI 、 NDK 学习!

    转载的! Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互.JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) ...

  6. NYOJ题目125盗梦空间

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAssAAANLCAIAAAA4rUfgAAAgAElEQVR4nOydq7LdyrKm+yXM/SDG4y

  7. poj 1837

    题目链接:http://poj.org/problem?id=1837 题目大意: 有一个天平,左臂右臂各长15,然后给出n,m,n代表有几个挂钩,挂钩给出负数代表在左臂的距离,正数则在右臂m代表有m ...

  8. jq div鼠标放上、离开马上展开、收缩方法

    <body> <div id="aa" style="width:500px; height:30px; border:1px solid #000&q ...

  9. Enter password for default keyring to unlock

    file /home/ok/.gnome2/keyrings/login.keyring /home/ok/.gnome2/keyrings/login.keyring: GNOME keyring, ...

  10. WebService – 3.后台调用WebService,根级别上的数据无效

    1.因为我的webservice返回的是json, 2.ajax传递跨域不安全, 3.contentType: "application/json; charset=utf-8", ...