最近做了一个“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,Listchilds) { 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 ListtreeNodes = new ArrayList (); private Context parentContext; private LayoutInflater layoutInflater; public ExpertsListViewAdapter(Context view, int myPaddingLeft,List 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; }