android - Viewpager onClickListener 在 android 中引用了错误的 View

标签 android events imageview android-viewpager fragment

首先,viewpage 预加载下一页和上一页。因此,如果我当前查看 PageB ,它实际上也会存储页面 A 和页面 C View 。

它导致了问题。当我在 pageB 中时,我在其上按下 onClickListener,它获得了 pageC 的位置,另外,我想更改 pageB 中的 ImageView 之一,但是在我按下按钮后,结果更改了 ImageView C页

这是代码 fragment ,我扩展了 PagerAdapter

  public class CustomPagerAdapter extends PagerAdapter {
        private ArrayList<Item> items;
        private LinearLayout rootView;
        private NetworkImageView album;
        private ImageView left;
        private ImageView right;
        private int imagePos;
        private String[] img;
        private WebView mWebView;
        private ImageView i;
        private ImageView i2;
        private WebView fbLikeBtn;
        private WebView sinaLikeBtn;
        private String type;
        private TextView report;
        private TextView id;
        private TextView name;
        private TextView age_brand;
        private TextView gender_model;
        private TextView feature;
        private TextView remarks;
        private TextView location;
        private TextView date;
        private TextView reward;
        private ImageView find;
        private ImageView email;
        private ImageView call;
        private ImageView share;
        private ImageView gps;
        private ImageView play_record;
        private Item item;
        private String isComplete;
        private LinearLayout reward_layout;
        private DownloadManager mgr;
        private boolean isStartPlay;
        private MediaPlayer myPlayer;
        private BroadcastReceiver onComplete;
        private String intent_type_string;
        private String intent_type;
        private String intent_msg;

        public CustomPagerAdapter(ArrayList<Item> items) {
            this.items = items;
        }

        @Override
        public Object instantiateItem(ViewGroup container, final int position) {
            rootView = (LinearLayout) LayoutInflater.from(ctx).inflate(R.layout.item_detail, null);

            item = (Item) items.get(position);

            album = (NetworkImageView) rootView.findViewById(R.id.img);
            left = (ImageView) rootView.findViewById(R.id.left);
            right = (ImageView) rootView.findViewById(R.id.right);
            share = (ImageView) rootView.findViewById(R.id.share);
            find = (ImageView) rootView.findViewById(R.id.find);
            email = (ImageView) rootView.findViewById(R.id.email);
            call = (ImageView) rootView.findViewById(R.id.call);
            gps = (ImageView) rootView.findViewById(R.id.gps);
            report = (TextView) rootView.findViewById(R.id.report);
            id = (TextView) rootView.findViewById(R.id.id);
            name = (TextView) rootView.findViewById(R.id.name);
            age_brand = (TextView) rootView.findViewById(R.id.age_brand);
            gender_model = (TextView) rootView.findViewById(R.id.gender_model);
            feature = (TextView) rootView.findViewById(R.id.feature);
            remarks = (TextView) rootView.findViewById(R.id.remarks);
            location = (TextView) rootView.findViewById(R.id.location);
            date = (TextView) rootView.findViewById(R.id.date);
            reward = (TextView) rootView.findViewById(R.id.reward);
            play_record = (ImageView) rootView.findViewById(R.id.play_record);
            reward_layout = (LinearLayout) rootView.findViewById(R.id.reward_layout);

            name.setText(getResources().getString(R.string.name) + item.name);

            imagePos = 0;

            if (item.image_url != null) {

                img = new String[item.image_url.length];
                for (int i = 0; i < item.image_url.length; i++) {
                    img[i] = item.image_url[i];
                }

                if (img.length == 1) {
                    album.setImageUrl(Constant.request_imageFolder + item.user_id + "/" + item.image_url[0], mImageLoader);
                    left.setVisibility(View.GONE);
                    right.setVisibility(View.GONE);
                } else {
                    album.setImageUrl(Constant.request_imageFolder
                            + item.user_id + "/" + item.image_url[0],
                            mImageLoader);
                    left.setVisibility(View.GONE);
                    left.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            if (imagePos != 0) {
                                imagePos--;
                                right.setVisibility(View.VISIBLE);
                                album.setImageUrl(Constant.request_imageFolder
                                        + item.user_id + "/"
                                        + item.image_url[imagePos],
                                        mImageLoader);
                                if (imagePos == 0)
                                    left.setVisibility(View.GONE);
                            }
                        }
                    });
                    right.setOnClickListener(new OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            if (imagePos != item.image_url.length - 1) {
                                imagePos++;
                                left.setVisibility(View.VISIBLE);
                                album.setImageUrl(Constant.request_imageFolder
                                        + item.user_id + "/"
                                        + item.image_url[imagePos],
                                        mImageLoader);
                                if (imagePos == item.image_url.length - 1)
                                    right.setVisibility(View.GONE);
                            }
                        }
                    });
                }
                album.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        item = (Item) items.get(position);
                        Intent intent = new Intent(ctx, Zoom.class);
                        intent.putExtra("photo_list", item.image_url);
                        intent.putExtra("pos", imagePos);
                        intent.putExtra("user_id", item.user_id);
                        startActivity(intent);
                    }
                });
            } else {
                album.setDefaultImageResId(R.drawable.image_null);
                album.setImageResource(R.drawable.image_null);
                left.setVisibility(View.GONE);
                right.setVisibility(View.GONE);
            }

            gps.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    item = (Item) items.get(position);
                    Intent intent = new Intent(ctx, MapSingle.class);
                    intent.putExtra("msg", "ID:" + item.id + " " + intent_type_string + " - " + item.name);
                    intent.putExtra("lat", item.lat);
                    intent.putExtra("lng", item.lng);
                    intent.putExtra("type", intent_type_string);
                    startActivity(intent);
                }
            });

            container.addView(rootView);
            return rootView;
        }

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

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

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

代码中变量album是换图的目标,变量left和right是切换按钮。非常感谢

最佳答案

您的问题是 ViewPager 将一次创建多个页面(默认情况下,一个在当前查看的页面之前,一个在之后)。因此您的引用将指向最后创建的页面。

理想情况下,您应该有一个 custom view每个页面都有自己的引用。

关于android - Viewpager onClickListener 在 android 中引用了错误的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28450418/

相关文章:

android - 如何在android中获取显示图像的宽度和高度?

java - Android ImageView 动画不显示

android - React Native MQTT.js 不适用于 Android 9+

android - 恢复应用内购买的安全问题

javascript - 通过拖动鼠标在 inputField 中标记文本

c# - 如何管理在运行时创建的 WinForms 按钮的委托(delegate)?

php - 交响乐 4 : ignore kernel events coming from debug toolbar

java - 应用 TranslateAnimation 时 ImageView 消失

android - 致命的 : [Errno 13] Permission denied when repo init android source 4. 1

android - 易趣 API 过滤器不工作