最近做项目的时候需要用到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的刷新效率。
只能以后再慢慢细究了,如果有哪位大大已经有了更好的解决方案,请分享给我~~~~