解决android expandablelistview 里面嵌入gridview行数据重复问题

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

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



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


ExpertGridAdapter.java  gridview的adapter

public class ExpertGridAdapter extends BaseAdapter {
	    private LayoutInflater inflater;
	    private CsBlogger[] datals;
	    
	    private Context mContext;
	    private String TAG="ExpertGridAdapter";
	 
	    public ExpertGridAdapter(Context context,List<CsBlogger> childs) {
	        this.inflater = LayoutInflater.from(context);
	        
	        datals=new CsBlogger[childs.size()];
	        childs.toArray(datals);
     
	        CsLog.d("maomao", "childs.size:"+childs.size());
	        mContext=context;
	    }
	 
	    @Override
	    public int getCount() {
	        return datals.length;
	    }
	 
	    @Override
	    public Object getItem(int position) {
	        return datals[position];
	    }
	 
	    @Override
	    public long getItemId(int position) {
	        return position;
	    }
	 
	    @Override
	    public View getView(int position, View convertView, ViewGroup parent) {
	        ViewHolder holder;
	        if (convertView==null) {
	            holder=new ViewHolder();
	            convertView=this.inflater.inflate(R.layout.csblog_expert_item_menu, null);
	            holder.iv=(ImageView) convertView.findViewById(R.id.item_image);
	            holder.tv=(TextView) convertView.findViewById(R.id.item_text);
	            convertView.setTag(holder);
	        }
	        else {
	           holder=(ViewHolder) convertView.getTag();
	        }
	        CsBlogger expert=datals[position];

	        
	        DisplayImageOptions options; // 显示图像设置
	        ImageLoader imageLoader = ImageLoader.getInstance();// 得到图片加载器
			// 图片加载器初始化
			imageLoader.init(ImageLoaderConfiguration.createDefault(mContext));
			// 使用DisplayImageOptions.Builder()创建DisplayImageOptions
			options = new DisplayImageOptions.Builder()
					.showStubImage(R.drawable.blogger) // 设置图片下载期间显示的图片
					.showImageForEmptyUri(R.drawable.blogger) // 设置图片Uri为空或是错误的时候显示的图片
					.showImageOnFail(R.drawable.blogger) // 设置图片加载或解码过程中发生错误显示的图片
					.cacheInMemory() // 设置下载的图片是否缓存在内存中
					.cacheOnDisc() // 设置下载的图片是否缓存在SD卡中
					.displayer(new RoundedBitmapDisplayer(20)) // 设置成圆角图片
					.build(); // 创建配置过得DisplayImageOption对象
			
			
	        

	        
	     // 异步加载图片  专家头像
	     			imageLoader
	     					.displayImage(expert.getUserface(),  holder.iv, options);
	        
	        
	        holder.tv.setText(expert.getNickname());
	        return convertView;
	    }
	    private class ViewHolder{
	        ImageView iv;
	        TextView tv;
	    }
	 

}


ExpertsListViewAdapter.java  可扩展的listview

public class ExpertsListViewAdapter extends BaseExpandableListAdapter implements
		OnItemClickListener
{
	public static final int ItemHeight = 136;// 每项的高度
	public static final int PaddingLeft = 96;// 每项的高度
	private int myPaddingLeft = 0;

	private List<TreeNode> treeNodes = new ArrayList<TreeNode>();

	private Context parentContext;

	private LayoutInflater layoutInflater;


	public ExpertsListViewAdapter(Context view, int myPaddingLeft,List<TreeNode> treeNodes)
	{
		parentContext = view;
		this.myPaddingLeft = myPaddingLeft;
		this.treeNodes=treeNodes;
	}


	public void RemoveAll()
	{
		treeNodes.clear();
	}

	public CsBlogger getChild(int groupPosition, int childPosition)
	{
		return treeNodes.get(groupPosition).childs.get(childPosition);
	}
	@Override
	public int getChildrenCount(int groupPosition)
	{
		//return treeNodes.get(groupPosition).childs.size();
		//  返回值必须为1,否则会重复数据
		return 1;
	}

	 public TextView getTextView(Context context)
	{
		AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
				ViewGroup.LayoutParams.FILL_PARENT, ItemHeight);

		TextView textView = new TextView(context);
		textView.setLayoutParams(lp);
		textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
		return textView;
	}

	
	 
	 class ExpandableListHolder {  
		 CsGridView grdiview;  

	    }  
	 
	private ExpertGridAdapter adatper;
	/**
	 * 可自定义ExpandableListView
	 */
	public View getChildView(int groupPosition, int childPosition,
			boolean isLastChild, View convertView, ViewGroup parent)
	{
		CsLog.d("maomao", "getChildView, groupPosition:"+groupPosition+",childs size:"+treeNodes.get(groupPosition).childs.size());
		//if (convertView == null)
		{	
			CsLog.d("maomao", "converView is null");
			layoutInflater = (LayoutInflater) parentContext
					.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
			convertView = layoutInflater.inflate(R.layout.csblog_expert_view, null);
			

			
			CsGridView toolbarGrid = (CsGridView) convertView
					.findViewById(R.id.GridView_toolbar);
			toolbarGrid.setNumColumns(4);// 设置每行列数
			toolbarGrid.setGravity(Gravity.CENTER);// 位置居中
			toolbarGrid.setHorizontalSpacing(10);// 水平间隔
			adatper=new ExpertGridAdapter(parentContext,treeNodes.get(groupPosition).childs);
			toolbarGrid.setAdapter(adatper);// 设置菜单Adapter
			toolbarGrid.setOnItemClickListener(this);
			adatper.notifyDataSetChanged();
		}
		//else{
		//	CsLog.d("maomao", "convertView!=null");
		//}
		
		return convertView;
	}

	/**
	 * 可自定义list
	 */
	public View getGroupView(int groupPosition, boolean isExpanded,
			View convertView, ViewGroup parent)
	{
		TextView textView = getTextView(this.parentContext);
		String gname=getGroup(groupPosition).toString()+"("+treeNodes.get(groupPosition).childs.size()+")";
		textView.setText(gname);
		textView.setPadding(myPaddingLeft + PaddingLeft, 0, 0, 0);
		return textView;
	}
	


	public long getChildId(int groupPosition, int childPosition)
	{
		return childPosition;
	}

	public Object getGroup(int groupPosition)
	{
		return treeNodes.get(groupPosition).parent;
	}

	public int getGroupCount()
	{
		return treeNodes.size();
	}

	public long getGroupId(int groupPosition)
	{
		return groupPosition;
	}

	public boolean isChildSelectable(int groupPosition, int childPosition)
	{
		return true;
	}

	public boolean hasStableIds() {  
        return true;  
    }  
  

	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id)
	{
		Toast.makeText(parentContext, "当前选中的是:" + position, Toast.LENGTH_SHORT)
				.show();

	}
}


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

	@Override
	public int getChildrenCount(int groupPosition)
	{
		//return treeNodes.get(groupPosition).childs.size();
		//  返回值必须为1,否则会重复数据
		return 1;
	}

  • 加入CSDN技术群:221057495 与我交流


  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风口猪炒股指标

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值