关于SwipeMenuListView的一个BUG

最近做项目的时候需要用到listview的左滑菜单,遂找到了SwipeMenuListView这个开源的控件,扩展自listview。

由于需要达到这样的效果

第一种方案:ScrollView中添加SwipeMenuListView + LinerLayout

重写onmeasure方法,达到SwipeMenuListView所需效果,如果不重新改方法,SwipeMenuListView只显示一行宽度。

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        if(SIZE_TYPE == SIZE_TYPE_WRAP) {
            super.onMeasure(widthMeasureSpec, expandSpec);
        } else {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }


不过出现了一点问题,在其子界面中,修改某一项的内容后,需要刷新该界面,由于前期搭建框架使用的方法的问题,子界面修改时,实时刷新该界面,

刷新效率成问题。list中的子项越多,效率越低,不符合要求,遂弃用。


第二种方案:SwipeMenuListView显示两类View

上部分正常显示数据itemView,最后一个itemView中,显示第二类带输入框的View。如果正常显示的数据的数量不足一屏时,显示效果正常,但是如果

需要显示的数据再多的时候,最后需要显示的带输入框的View没有正常显示,变成了显示数据的itemView。一定是重用导致的问题,但是修改自己代码的

重用问题依旧。

上网查找,通过重写Adapter中的getItemViewType和getViewTypeCount,并在getview中进行使用和判断,即可修复之前产生的问题。

        public int getItemViewType(int position) {
            //第一项和第二项属于一类,剩下的属于一类  
            if (position == getCount() - 1) {  
                return 0;  
            } else {  
                return 1;  
            }  
        }  
 
        @Override  
        public int getViewTypeCount() {//表示我共有两种item要显示,  
            // TODO Auto-generated method stub  
            return 2;  
        }

调试运行,问题解决,可以正常的滑动显示。

满心欢喜的准备搞定收工的时候,发现问题,数据量超过一屏的时候,反复滑动后,带输入框的itemView之前的显示数据itemView出现显示数据错乱的问题,

唉,还需要继续奋斗。继续查找可能的解决办法,发现都不行。

思虑再三,决定从开源控件SwipeMenuListView的源码中,查找一下问题

当看到这里的时候,发现问题

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        SwipeMenuLayout layout = null;
//        if (convertView == null) {
            View contentView = mAdapter.getView(position, convertView, parent);
            SwipeMenu menu = new SwipeMenu(mContext);
            menu.setViewType(mAdapter.getItemViewType(position));
            createMenu(menu);
            SwipeMenuView menuView = new SwipeMenuView(menu,
                    (SwipeMenuListView) parent);
            menuView.setOnSwipeItemClickListener(this);
            SwipeMenuListView listView = (SwipeMenuListView) parent;
            layout = new SwipeMenuLayout(contentView, menuView,
                    listView.getCloseInterpolator(),
                    listView.getOpenInterpolator());
            layout.setPosition(position);
//        } else {
//            layout = (SwipeMenuLayout) convertView;
//            layout.closeMenu();
//            layout.setPosition(position);
//            View view = mAdapter.getView(position, layout.getContentView(),
//                    parent);

//        }
        return layout;
    }


注意注释部分和标红的部分,没错,重用。OK,修改源码,把重用去掉。

重新编译运行后,问题解决。


写在最后:

这次的问题虽然解决了,但是还是留了尾巴和隐患,这不是最好的解决办法,虽然问题解决了,但是影响了listview的刷新效率。

只能以后再慢慢细究了,如果有哪位大大已经有了更好的解决方案,请分享给我~~~~

猜你喜欢

转载自blog.csdn.net/heye644171300/article/details/52311187
今日推荐