【问题标题】:Viewpager: lose the state of toggle button when swipingViewpager:滑动时失去切换按钮的状态
【发布时间】:2015-04-02 22:58:42
【问题描述】:

我正在使用 Viewpager 和 PagerAdapter 创建一个带有图像和点赞按钮的图库。请参考我的代码:

public class GalleryAdapter extends PagerAdapter {

private Activity _activity;
private ArrayList<MyPhotoItem> _imageCollection;

// Components in fullsceen layout
ImageView imgDisplay;
private ToggleButton btnLike;

// Variable for btnLike
private boolean isChecked;

// constructor
public GalleryAdapter(Activity activity,
        ArrayList<MyPhotoItem> images) {
    this._imageCollection = images;
}

@Override
public int getCount() {
    return this._imageCollection.size();
}

@Override
public boolean isViewFromObject(View view, Object object) {
    return view == ((RelativeLayout) object);
}

@Override
public Object instantiateItem(ViewGroup container, int position) {

    inflater = (LayoutInflater) _activity
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View viewLayout = inflater.inflate(R.layout.layout_gallery_image,
            container, false);


    imgDisplay = (ImageView) viewLayout
            .findViewById(R.id.layout_gallery_imgDisplay);
    Picasso.with(this._activity.getApplicationContext())
            .load(_imageCollection.get(position).url).into(imgDisplay);

    btnLike = (ToggleButton) viewLayout
            .findViewById(R.id.layout_gallery_likeButton);
    btnLike.setOnCheckedChangeListener(null);
    btnLike.setChecked(isChecked);
    btnLike.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
            if (isChecked) {
                isChecked = true;

            } else {
                isChecked = false;

            }
        }

    });

    ((ViewPager) container).addView(viewLayout);

    return viewLayout;
}


@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    ((ViewPager) container).removeView((RelativeLayout) object);

}

@Override
public int getItemPosition(Object object) {
    return PagerAdapter.POSITION_NONE;
}

}

我当前的问题:当我滑动到其他页面并返回之前的页面时,Viewpager 不会保持切换按钮状态(假设在 Viewpager 中加载了 5 张照片)。我浏览了几篇 Stackoverflow 帖子,但没有一个可以正确解决我的问题。

任何建议将不胜感激。提前致谢。

【问题讨论】:

  • 由于片段被回收,您的视图可能会被重置。最好在 LocalStorage 中设置值并检查 LocalStorage 的先前值并将值设置为查看。

标签: android android-viewpager togglebutton android-pageradapter recycle


【解决方案1】:

感谢您的回复。尽管它们中的大多数都不是我案件的直接答案,但它们为我提供了一些线索来解决我的问题。这可能不是最好的解决方案,但它解决了我的问题。

解决办法:

1/ 添加一个标志来保持对象中的切换状态:

public class MyPhotoItem {
...
  public boolean like_flag;
...
}

2/ 自定义一点 OnCheckedChangeListener:

class OnLikeCheckedChangeListener implements OnCheckedChangeListener {
    int mPosition;

    // constructor
    public OnLikeCheckedChangeListener(int position) {
        this.mPosition = position;
    }
    @Override
    public void onCheckedChanged(CompoundButton buttonView,
            boolean isChecked) {
     if (isChecked){ 
            _imageCollection.get(_position).like_flag = true;
            notifyDataSetChanged();
      }
     else{
            _imageCollection.get(_position).like_flag = false;
            notifyDataSetChanged();
     }
  }
}

3/ 根据标志设置切换状态:

@Override
public Object instantiateItem(ViewGroup container, int position) {
  ...
  // Init Toggle status
    if (_imageCollection.get(position).like_flag) {
        btnLike.setChecked(true);
    } else {
        btnLike.setChecked(false);
    }
  btnLike.setOnCheckedChangeListener(new OnLikeCheckedChangeListener(
            position));
  ...
 }

就是这样。在滑动 Viewpager 期间保持切换状态。任何人有更好的解决方案或好的做法,请随时发表评论。

享受编码!

【讨论】:

    【解决方案2】:

    如果 ViewPager 中应该只有 5 张图片,那么您可以尝试使用 setOffscreenPageLimit (int limit)

    【讨论】:

      【解决方案3】:

      发生这种情况是因为在您更改页面时,您的寻呼机视图不断被回收,因此页面中的视图不断被重新创建,因此您丢失了 ToggleButton 的状态,解决方案是将状态保存在当 ToggleButton 的状态发生变化时的 SharedPreferences 并在 instantiateItem 方法上检索它,并将状态设置为 ToggleButton。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-03
        • 2020-01-04
        • 2020-09-20
        • 1970-01-01
        • 2018-08-14
        • 1970-01-01
        相关资源
        最近更新 更多