Android ViewPager点击按钮获取当前图片标题异常,如何解决?
解决ViewPager按钮点击获取当前图片标题错误的问题
这个问题我太熟了!你遇到的是典型的成员变量被覆盖导致的问题——因为img_title是一个全局/成员变量,每次instantiateItem创建页面时都会更新它的值。当你滑动ViewPager后点击按钮,此时img_title已经被更新成了下一个页面的标题,自然就不对了。
下面给你两种可靠的解决方案:
方案一:将图片数据与按钮绑定(推荐)
把当前页面的图片数据直接存到按钮的Tag中,点击时从Tag里取出对应的数据,彻底避免成员变量覆盖的问题:
@Override public Object instantiateItem(ViewGroup container, int position) { layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = layoutInflater.inflate(R.layout.image_fullscreen_preview, container, false); imageViewPreview = (ImageView) view.findViewById(R.id.image_preview); imageViewPreview.setOnTouchListener(new ImageMatrixTouchHandler(view.getContext())); // 使用局部变量存储当前页面的图片数据,不要用成员变量 Photos currentImage = images.get(position); Glide.with(getActivity()) .load(currentImage.getUrl()) .thumbnail(Glide.with(getActivity()).load(R.drawable.loader)) .fitCenter() .crossFade() .into(imageViewPreview); Button save_img = (Button) view.findViewById(R.id.save_img); // 把当前图片的标题存到按钮的Tag里 save_img.setTag(currentImage.getTitle()); save_img.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 从Tag中取出当前页面的标题 String currentTitle = (String) view.getTag(); Toast.makeText(getActivity(), currentTitle, Toast.LENGTH_SHORT).show(); } }); // 分享按钮同理,也可以把整个Photos对象存到Tag里方便后续使用 share_img.setTag(currentImage); share_img.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Photos targetImage = (Photos) view.getTag(); // 可以修改shareImage方法接收Photos对象,直接使用对应数据 shareImage(targetImage, view); } }); container.addView(view); return view; }
方案二:通过ViewPager当前位置获取数据
如果你已经持有ViewPager的实例引用,可以在点击按钮时直接获取当前页面的位置,再从数据源中取出对应数据:
// 先确保你有ViewPager的实例引用 private ViewPager mViewPager; // 然后修改按钮点击事件 save_img.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // 获取ViewPager当前显示的页面位置 int currentPosition = mViewPager.getCurrentItem(); Photos currentImage = images.get(currentPosition); Toast.makeText(getActivity(), currentImage.getTitle(), Toast.LENGTH_SHORT).show(); } });
两种方案对比
- 方案一更可靠:数据和当前页面的按钮直接绑定,不受ViewPager滑动状态影响,哪怕用户在滑动过程中点击按钮也能拿到正确数据。
- 方案二更简洁:但要注意如果用户在ViewPager滑动未完成时点击,可能会拿到旧的位置(不过大部分场景下不会出现这个问题)。
最后提醒:尽量不要用全局/成员变量存储每个页面的临时数据,每个页面的数据应该和页面视图绑定,或者通过当前位置从数据源获取,这样就能避免类似的数据覆盖问题啦。
内容的提问来源于stack exchange,提问作者mukeshsoni
相关产品推荐
相关产品推荐

