最近在做一个购物车的过程中使用到了ExpandableListview,购物车要求的效果如下图:
其实看到这个设计图最先想到的是用ListView嵌套去解决的,于是我就用ListView嵌套去做了一个版本。但是结果不让人很满意,因为每一个Item里面的内容太多了,所以导致滑动的时候出现比较明显的卡顿。
后来我就想到使用ExpandableListView去实现这个效果,只要把ExpandableListView的Group的点击事件去掉,然后把所有的组展开就能达到相应的效果。很快我使用ExpandableListView达到了相应的效果,购物车能够正常的显示出来了。但是产品要求的还需要对购物车进行增删查改、选中的一些操作。
在进行了删除操作之后我发现ExpandableListView当中的Item出现了重复的显示。在网上看到一些开发者也遇到了同样的数据重复的问题。并找了一些解决方案。例如:http://www.eoeandroid.com/thread-918482-1-1.html?_dsign=3d28cd51 每次操作之后将所有的组关闭在打开。使用这样的操作起到了一定的效果。但是测试还是偶尔能测出来数据重复的问题,时而出现,时而不出现。让人很是头疼。想在网上找类似的自定义控件,但是也没找到。(如果有人知道又类似控件希望能告知我一下)
然后我想Item的数量是由Adapter去控制的。另外我发现AdapterView有一个getCount的方法返回的是view的item的数量。AdapterView与ExpandableListview的关系如下图。之后我发现AdapterView.getCount返回的数量与Adapter的中返回的Adapter的数量不一致。问题也就是处在这里。
结合之前的解决方式,下面是我解决问题的代码。
private void initGroup(int count) {
showProgress();
if (list.size() == 0) {
mRefreshView.showEmptyView();
} else {
mRefreshView.hideEmptyView();
}
final int realCount = listView.getCount();
if (count == realCount) {
hideProgress();
return;
} else {
int size = list.size();
for (int i = 0; i < size; i++) {
listView.collapseGroup(i);
listView.expandGroup(i);
}
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
mHandler.sendEmptyMessage(realCount);
}
}, 500);
}
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
initGroup(msg.what);
}
};
方法不是跟高级,但是达到了效果,希望有更好的方法的大神能提出高见。