先明确说明问题,省的大家看了半天才发现不是自己想要的东西。
前提:viewpager嵌套gridview,gridivew再嵌套button ,想点击gridview的item,换button的背景颜色
问题:gridview的点击事件可以执行,但是gridview,adapter刷新不对
我想实现的效果如下图:
我的实现原理是:viewpager的每一页会new一个gridview(viewpager嵌套gridview的实现这里不再赘述,有不理解的看这个http://blog.csdn.net/badboy1110/article/details/8295833)
解决过程:
1、adapter刷新的实现方法如下图:
这样写的话就出现了本文的bug。经过debug发现这样刷新,我们点击的是第0页的button,但刷新的是最后一页的getView。so,刷新的adapter并不是点击的gridview相对应的adapter
知道了问题,接下来修改如下
2、修改如下图:
这样修改之后,发现是可以刷新到当前页的button背景,但是其他页没有刷新,之前点选的button还处于选中状态(每页一个选中的button,oh,NO)。
继续修改,心好累。。。
3、修改如下:刷新所有的gridview
这样修改之后,终于解决了!如果哪位大神路过,有更好的解决方式,请联系我。。。
追加:应私信给我的朋友,给出以下代码
1、图四的 list_Views 指的是保存每个页的gridview的视图的list,我的是:
private List<MyGridView> list_Views;
2.setSelectedPosition方法:
public class ViewPager_GV_ItemAdapter extends BaseAdapter {
private Listlist, listnew; private Context context;
/** * ViewPager页码 */
private int index;
/** 根据屏幕大小计算得到每页item个数 */
//private int pageItemCount;
/** * 传进来的list的长度 */
private int totalSize;
/** * 当前item的实际个数 */
// private int itemRealNum
//起始下标 private int list_index = 0;
private int selectedPosition = 0;
// 选中的位置
private int currentPage = 0;
private boolean isSelected = true;//只有一个是选中页(初始化默认第一个)
public ViewPager_GV_ItemAdapter(Context context, Listlist, int index) {
this.context = context;
this.index = index;
// this.pageItemCount = pageItemCount;
this.list = list;
totalSize = list.size();
listnew = new ArrayList<>();
// 当前页的item对应的实体在List中的起始下标
list_index = index * 10;
/*for (int i = list_index; i < list.size(); i++) {
listnew.add(list.get(i));
}*/
}
/**
* 数量超过十个就返回10
* 不够十个就显示剩余个数
*
* @return
*/
@Override
public int getCount() {
int size = totalSize / 10;
if (index == size)
return totalSize - 10 * index;
else
return 10;
}
@Override
public Object getItem(int position) {
if (list != null) {
return list.get(position);
} else {
return 0;
}
}
@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 = LayoutInflater.from(context).inflate(R.layout.banner_gridviewbtn, parent, false);
holder.gridviewBtn = (Button) convertView.findViewById(R.id.gridviewBtn);
convertView.setTag(holder);
}
holder = (ViewHolder) convertView.getTag();
//当前数据下标 = 本页起始下标+本页下标
int indexPresent = list_index + position;
// TestUtils.strSystemOut("indexPresent=" + indexPresent + ",selectedPosition=" + selectedPosition + ",list_index===" + list_index + ",position===" + position);
holder.gridviewBtn.setText(list.get(indexPresent).getName());
if (!isSelected){
holder.gridviewBtn.setBackgroundResource(R.drawable.xiaolei_normal);
}else{
if (indexPresent == selectedPosition) {
holder.gridviewBtn.setBackgroundResource(R.drawable.xiaolei_focused);
} else {
holder.gridviewBtn.setBackgroundResource(R.drawable.xiaolei_normal);
}
}
return convertView;
}
/**
* 点击选中
*
* @param currentIndex 当前页
* @param position //点击的position
*/
public void setSelectedPosition(int currentIndex, int position,boolean isSelected) {
this.selectedPosition = position;
this.list_index = currentIndex * 10;// list_index :起始下标
this.currentPage = currentIndex;
this.isSelected = isSelected;
}
class ViewHolder {
Button gridviewBtn;
}
}