如果点击上一个项目,Android PagerAdapter不会报告正确的位置

如果点击上一个项目,Android PagerAdapter不会报告正确的位置,第1张

概述我有一个ViewPager设置为负值边距,以获得如下效果: 现在,我想要发生的是当我点击当前视图左侧或右侧的视图.它应该选择该视图,并在ViewPager上调用setCurrentItem().这可以在当前项目右侧的视图中正常工作,但不能查看当前项目的左侧.当我点击该视图时,向我报告位置是当前视图的位置. 这有一些代码,如果它有帮助.这是从PagerAdapter.instantiateItem 我有一个VIEwPager设置为负值边距,以获得如下效果:

现在,我想要发生的是当我点击当前视图左侧或右侧的视图.它应该选择该视图,并在VIEwPager上调用setCurrentItem().这可以在当前项目右侧的视图中正常工作,但不能查看当前项目的左侧.当我点击该视图时,向我报告的位置是当前视图的位置.

这有一些代码,如果它有帮助.这是从PagerAdapter.instantiateItem()我在onClick()上触发:

@OverrIDe    public Object instantiateItem(final VIEwGroup container,final int position)    {        cardlayout.setTag(profile);        cardlayout.setonClickListener(new VIEw.OnClickListener()        {            @OverrIDe            public voID onClick(VIEw vIEw)            {                // mOnItemClickListener passed in to adapter on initialization                mOnItemClickListener.onItemClick(null,vIEw,position,0);                // other stuff happens here as well            }        });    }

任何感兴趣的人都可以使用整个PagerAdapter类:

static class GiveTenPagerAdapter extends PagerAdapter{    private final int ANIMATION_DURATION;    private ListenerOnGiveTakeClick mListenerOnGiveTakeClick;    private List<GiveTen> mGiveTens;    private Context mContext;    private LayoutInflater mInflater;    private boolean mIsCrossFadeAnimationRunning;    private int mSquarePhotoSIDeLength;    GiveTenPagerAdapter(List<GiveTen> giveTens,Context context,ListenerOnGiveTakeClick ListenerOnGiveTakeClick)    {        mGiveTens = giveTens;        mContext = context;        mListenerOnGiveTakeClick = ListenerOnGiveTakeClick;        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);        ANIMATION_DURATION = mContext.getResources().getInteger(androID.R.integer.config_mediumAnimTime);    }    List<GiveTen> getGiveTens()    {        return this.mGiveTens;    }    @OverrIDe    public int getCount()    {        return mGiveTens.size();    }    @OverrIDe    public boolean isVIEwFromObject(VIEw vIEw,Object o)    {        return vIEw == o;    }    @OverrIDe    public Object instantiateItem(final VIEwGroup container,final int position)    {        Logger.d("position=" + position);        final GiveTen giveTen = mGiveTens.get(position);        final UserProfile profile = giveTen.getUserProfile();        final relativeLayout cardlayout = (relativeLayout) mInflater.inflate(R.layout.give_ten_card,null);        final relativeLayout profilePicLayout = (relativeLayout) cardlayout.findVIEwByID(R.ID.give_ten_profile_pic_layout);        final ImageVIEw profileImageVIEw = (ImageVIEw) cardlayout.findVIEwByID(R.ID.give_ten_profile_pic);        final VIEw vIEwFiller = cardlayout.findVIEwByID(R.ID.vIEw_filler);        final int RADIUS = Math.round(mContext.getResources().getDimension(R.dimen.give_ten_card_corner_radius));        profileImageVIEw.getVIEwTreeObserver().addOnPreDrawListener(new VIEwTreeObserver.OnPreDrawListener()        {            @OverrIDe            public boolean onPreDraw()            {                profileImageVIEw.getVIEwTreeObserver().removeOnPreDrawListener(this);                //kv Using Math.max() to ensure that at least 1 dimension is positive                //kv in case of some fucked up situation where the measured wIDth and                //kv height returns 0                int wIDthProfileImageVIEw = Math.max(profileImageVIEw.getMeasureDWIDth(),1);                int heightcardlayout = Math.max(profileImageVIEw.getMeasuredHeight(),1);                //kv Somehow we can get into a situation where we in this PreDrawListener and there                //kv are not give tens,which of course gives us a crash on mGiveTens.get(position)                //kv If we find ourselves in that case,just show icon_photo_placement_lg                if (mGiveTens.size() > 0)                {                    Picasso picasso = Picasso.with(Bakery.getInstance());                    picasso.setIndicatorsEnabled(BuildConfig.DEBUG);                    picasso.load(mGiveTens.get(position).getUserProfile().getProfilePic().getUrl())                            .noFade()                            .resize(wIDthProfileImageVIEw,heightcardlayout)                            .centerCrop()                            .transform(new PicassotransformationRounded(RADIUS,0))                            .into(profileImageVIEw);                }                else                {                    profileImageVIEw.setimageResource(R.drawable.icon_photo_placement_lg);                }                return true;            }        });        TextVIEw profilePicGenderCriteriaTextVIEw = (TextVIEw) cardlayout.findVIEwByID(R.ID.give_ten_profile_pic_textvIEw_gender_criteria);        TextVIEw profilePicCityTextVIEw = (TextVIEw) cardlayout.findVIEwByID(R.ID.give_ten_profile_pic_textvIEw_city);        if (profile.getCriteriaGender().equals("m"))        {            profilePicGenderCriteriaTextVIEw.setText(R.string.give_ten_text_gender_criteria_male);        }        else        {            profilePicGenderCriteriaTextVIEw.setText(R.string.give_ten_text_gender_criteria_female);        }        String cityText = mContext.getResources().getString(R.string.give_ten_profile_pic_text_city_prefix)                + " "                + mGiveTens.get(position).getUserProfile().getCity()                + ","                + mGiveTens.get(position).getUserProfile().getState();        profilePicCityTextVIEw.setText(cityText);        container.addVIEw(cardlayout);        final relativeLayout giveTenDetailsLayout = getDetailsLayout(cardlayout,giveTen);        vIEwFiller.setonClickListener(new VIEw.OnClickListener()        {            @OverrIDe            public voID onClick(VIEw vIEw)            {                Logger.d("vIEw=" + vIEw);                boolean shouldCrossFade = !mListenerOnGiveTakeClick.onGiveTenClick(position - 1,true);                if (mIsCrossFadeAnimationRunning == false && position > 0 && shouldCrossFade)                {                    crossfadeVIEws(profilePicLayout,giveTenDetailsLayout);                    ManagerAnalytics.sendEvent(ManagerAnalytics.EVENT_VISITED_GIVE_TEN_CARD,ManagerAnalytics.ST1_PAGEVIEW);                }            }        });        VIEw.OnClickListener onClickListener = new VIEw.OnClickListener()        {            @OverrIDe            public voID onClick(VIEw vIEw)            {                Logger.d("vIEw=" + vIEw);                boolean shouldCrossFade = !mListenerOnGiveTakeClick.onGiveTenClick(position,false);                if (mIsCrossFadeAnimationRunning == false && shouldCrossFade)                {                    crossfadeVIEws(giveTenDetailsLayout,profilePicLayout);                    ManagerAnalytics.sendEvent(ManagerAnalytics.EVENT_VISITED_GIVE_TEN_CARD,ManagerAnalytics.ST1_PAGEVIEW);                }            }        };        cardlayout.setonClickListener(onClickListener);        ScrollVIEw giveTenCardDetailScrollContainer = (ScrollVIEw) cardlayout.findVIEwByID(R.ID.give_ten_card_detail_scroll_container);        if (giveTenCardDetailScrollContainer != null)        {            linearLayout giveTenDetailsFIEldLayout = (linearLayout) giveTenCardDetailScrollContainer.findVIEwByID(R.ID.give_ten_detail_fIElds_layout);            giveTenDetailsFIEldLayout.setTag(profile);            giveTenDetailsFIEldLayout.setonClickListener(new VIEw.OnClickListener()            {                @OverrIDe                public voID onClick(VIEw vIEw)                {                    Logger.d("vIEw=" + vIEw);                    boolean shouldCrossFade = !mListenerOnGiveTakeClick.onGiveTenClick(position,false);                    if (mIsCrossFadeAnimationRunning == false && shouldCrossFade)                    {                        crossfadeVIEws(profilePicLayout,giveTenDetailsLayout);                        ManagerAnalytics.sendEvent(ManagerAnalytics.EVENT_VISITED_GIVE_TEN_CARD,ManagerAnalytics.ST1_PAGEVIEW);                    }                }            });        }        return cardlayout;    }    private voID crossfadeVIEws(final VIEw vIEw1,final VIEw vIEw2)    {        final VIEw visibleVIEw,invisibleVIEw;        if (vIEw1.getVisibility() == VIEw.VISIBLE)        {            visibleVIEw = vIEw1;            invisibleVIEw = vIEw2;        }        else        {            visibleVIEw = vIEw2;            invisibleVIEw = vIEw1;        }        mIsCrossFadeAnimationRunning = true;        invisibleVIEw.setAlpha(0.0f);        invisibleVIEw.setVisibility(VIEw.VISIBLE);        invisibleVIEw.animate()                .Alpha(1.0f)                .setDuration(ANIMATION_DURATION)                .setListener(new AnimatorListenerAdapter()                {                    @OverrIDe                    public voID onAnimationEnd(Animator animation)                    {                        mIsCrossFadeAnimationRunning = false;                    }                });        visibleVIEw.animate()                .Alpha(0.0f)                .setDuration(ANIMATION_DURATION)                .setListener(new AnimatorListenerAdapter()                {                    @OverrIDe                    public voID onAnimationEnd(Animator animation)                    {                        visibleVIEw.setVisibility(VIEw.GONE);                        mIsCrossFadeAnimationRunning = false;                    }                });    }    public voID crossFadeVIEws(VIEw vIEw)    {        final relativeLayout giveTenDetailLayout = (relativeLayout) vIEw.findVIEwByID(R.ID.give_ten_detail_layout);        final relativeLayout profilePicLayout = (relativeLayout) vIEw.findVIEwByID(R.ID.give_ten_profile_pic_layout);        crossfadeVIEws(profilePicLayout,giveTenDetailLayout);    }    private relativeLayout getDetailsLayout(VIEw parent,GiveTen giveTen)    {        relativeLayout giveTenDetailsLayout = (relativeLayout) parent.findVIEwByID(R.ID.give_ten_detail_layout);        UserProfile profile = giveTen.getUserProfile();        TextVIEw genderCriteriaTextVIEw = (TextVIEw) giveTenDetailsLayout.findVIEwByID(R.ID.give_ten_detail_gender_criteria_textvIEw);        if (profile.getCriteriaGender().equals("m"))        {            genderCriteriaTextVIEw.setText(R.string.give_ten_text_gender_criteria_male);        }        else        {            genderCriteriaTextVIEw.setText(R.string.give_ten_text_gender_criteria_female);        }        TextVIEw cityTextVIEw = (TextVIEw) giveTenDetailsLayout.findVIEwByID(R.ID.give_ten_detail_city_textvIEw);        cityTextVIEw.setText(profile.getCity() + "," + giveTen.getUserProfile().getState());        TextVIEw ageTextVIEw = (TextVIEw) giveTenDetailsLayout.findVIEwByID(R.ID.give_ten_detail_age_textvIEw);        ageTextVIEw.setText(mContext.getResources().getString(R.string.give_ten_text_age)                + " "                + DateUtils.getAgeFromBirthday(profile.getBirthday()));        TextVIEw heightTextVIEw = (TextVIEw) giveTenDetailsLayout.findVIEwByID(R.ID.give_ten_detail_height_textvIEw);        heightTextVIEw.setText(mContext.getResources().getString(R.string.give_ten_text_height)                + " "                + profile.getHeightFeet()                + "'"                + profile.getHeightInches());        TextVIEw religionTextVIEw = (TextVIEw) giveTenDetailsLayout.findVIEwByID(R.ID.give_ten_detail_religion_textvIEw);        religionTextVIEw.setText((mContext.getResources().getStringArray(R.array.religion)[Religion.getIndex(profile.getReligionAPIparam())]));        TextVIEw educationTextVIEw0 = (TextVIEw) giveTenDetailsLayout.findVIEwByID(R.ID.give_ten_detail_education_1_textvIEw);        TextVIEw educationTextVIEw1 = (TextVIEw) giveTenDetailsLayout.findVIEwByID(R.ID.give_ten_detail_education_2_textvIEw);        List<String> education = profile.getEducation();        List<Degree> degree = profile.getListdegrees();        if (education.size() > 0)        {            if (degree.size() > 0)            {                educationTextVIEw0.setText(education.get(0) + "/" + degree.get(0).toString().tolowerCase());            }            else            {                educationTextVIEw0.setText(education.get(0));            }            if (education.size() > 1)            {                if (degree.size() > 1)                {                    educationTextVIEw1.setText(education.get(1) + "/" + degree.get(1).toString().tolowerCase());                }                else                {                    educationTextVIEw1.setText(education.get(1));                }                educationTextVIEw1.setVisibility(VIEw.VISIBLE);            }        }        TextVIEw occupation = (TextVIEw) giveTenDetailsLayout.findVIEwByID(R.ID.give_ten_detail_occupation_textvIEw);        occupation.setText(profile.getoccupation());        final List<ImageVIEw> giveTenDetailPics = new ArrayList<ImageVIEw>();        giveTenDetailPics.add((ImageVIEw) giveTenDetailsLayout.findVIEwByID(R.ID.give_ten_detail_pic_1));        giveTenDetailPics.add((ImageVIEw) giveTenDetailsLayout.findVIEwByID(R.ID.give_ten_detail_pic_2));        giveTenDetailPics.add((ImageVIEw) giveTenDetailsLayout.findVIEwByID(R.ID.give_ten_detail_pic_3));        giveTenDetailPics.add((ImageVIEw) giveTenDetailsLayout.findVIEwByID(R.ID.give_ten_detail_pic_4));        //kv Calculate length of sIDe for photos        float wIDthPhotolayout = VIEwUtils.getScreenWIDth() -                2 * mContext.getResources().getDimension(R.dimen.give_ten_layout_margin_sIDe) -                2 * mContext.getResources().getDimension(R.dimen.give_ten_detail_margin_sIDe) -                6 * mContext.getResources().getDimension(R.dimen.give_ten_photo_margin_sIDe);        mSquarePhotoSIDeLength = (int) (wIDthPhotolayout / 4);        List<Photo> detailPhotos = profile.getPhotos();        for (int i = 0; i < detailPhotos.size(); i++)        {            final ImageVIEw imageVIEw = giveTenDetailPics.get(i);            final Photo photo = detailPhotos.get(i);            final String url = photo.getUrlthumbnail();            Logger.d("about to display " + url + ",length=" + mSquarePhotoSIDeLength);            Picasso.with(mContext)                    .load(url)                    .noFade()                    .resize(mSquarePhotoSIDeLength,mSquarePhotoSIDeLength)                    .placeholder(R.drawable.icon_photo_placement_s)                    .into(imageVIEw,new Callback()                    {                        @OverrIDe                        public voID onSuccess()                        {                            //Logger.e("success on " + url);                        }                        @OverrIDe                        public voID onError()                        {                            Logger.e("error");                        }                    });        }        return giveTenDetailsLayout;    }    @OverrIDe    public voID destroyItem(VIEwGroup container,int position,Object object)    {        container.removeVIEw((VIEw) object);    }}
解决方法 您可以拦截触摸事件并从该事件中获取坐标.
if(event.getRawX() < margin && canGoleft){goleft();}else if(event.getRawX() > screenWIDth - margin && canGoRight) {goRight();}else {   // We are not interested in this event,pass it down the food chain}
总结

以上是内存溢出为你收集整理的如果点击上一个项目,Android PagerAdapter不会报告正确的位置全部内容,希望文章能够帮你解决如果点击上一个项目,Android PagerAdapter不会报告正确的位置所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1133493.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存