最近做了一个“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. EMIS系统运行时提示【无法验证发行者,您确实要运行此软件吗? 】

    无法验证发行者,您确实要运行此软件吗? 遇到这个提示你怎么办? 运行 gpedit.msc 进入组策略用户配置 ==>管理模板==> winows组件 ==> 附件管理器在 &quo ...

  2. [转] 理解 Thread.Sleep 函数

    原文链接:http://www.cnblogs.com/ILove/archive/2008/04/07/1140419.html 我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时 ...

  3. Enum:Game of Lines(POJ 3668)

    画直线 题目大意:给定一些点集,要你找两点之间的连线不平行的有多少条 数据量比较少,直接暴力枚举,然后放到set查找即可 #include <iostream> #include < ...

  4. BestCoder27 1001.Jump and Jump... (hdu 5162) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5162 题目意思:有 n 个 kid,每个 kid 有三个成绩 a, b, c.选最大的一个成绩作为这个 ...

  5. August 13th 2016 Week 33rd Saturday

    What makes life dreary is the want of motive. 没有目标与动力,生活便会郁闷无光. Without dreams and hope, there will ...

  6. pmap

    .[root@localhost security]# pmap -d : -bash Address Kbytes Mode Offset Device Mapping r-x-- : bash b ...

  7. 解的个数(codevs 1213)

    题目描述 Description 已知整数x,y满足如下面的条件: ax+by+c = 0 p<=x<=q r<=y<=s 求满足这些条件的x,y的个数. 输入描述 Input ...

  8. 查询Oracle中字段名带"."的数据

    SDE中的TT_L线层会有SHAPE.LEN这样的字段,使用: SQL>select shape.len from tt_l; 或 SQL>select t.shape.len from ...

  9. 使用DateUtils和DateFormatUtils处理时间日期转换与SimpleDateFormat的区别

    在Apache Commons项目的Lang里面,有两个类:DateUtils和DateFormatUtils,专门用于处理时间日期转换.它们在 org.apache.commons.lang.tim ...

  10. fork与vfork的区别与联系

    fork()与vfock()都是创建一个进程,那他们有什么区别呢?总结有以下三点区别: 1. fork ():子进程拷贝父进程的数据段,代码段 vfork ( ):子进程与父进程共享数据段 2. fo ...