您的位置:首页 > 其它

关于SwipeMenuListView的一个BUG

2016-08-25 09:46 429 查看
最近做项目的时候需要用到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的刷新效率。

只能以后再慢慢细究了,如果有哪位大大已经有了更好的解决方案,请分享给我~~~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息