Recycler View not giving the correct position after scrolling

夙愿已清 提交于 2019-12-10 23:10:35

问题


I have used GridView with number of columns 1 and used adapter in which I am using a recyclerView for horizontal scroll. To be clear I have a gridview as the main view in which recyclerview is used in adapter. All the elements are shown in the view as accordingly but after i scroll the position that I am getting is not the correct position.The Adapter for recycler view is :

public class HorizontalRecyclerViewAdapter extends RecyclerView.Adapter<HorizontalRecyclerViewAdapter.ViewHolder>{


private Context context;
private ArrayList<Movie> movieList;

public HorizontalRecyclerViewAdapter(Context context,
                                   ArrayList<Movie> objects) {
    this.context = context;
    this.movieList = objects;
}


@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.movie_item, null);
    return new ViewHolder(v);
}

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onBindViewHolder(ViewHolder holder, int position) {



    Movie currentMovie = movieList.get(position);

    holder.textView.setText(currentMovie.getMovieName());


    //Logger.e("THE MOVIE NAME" , currentMovie.getMovieName());

    try {
        UrlImageViewHelper.setUrlDrawable(holder.imageView, currentMovie.getMoviePictureLinkString(), R.drawable.placeholder_logo);
    } catch (Exception e) {
        holder.imageView.setImageDrawable(context.getResources().getDrawable(R.drawable.placeholder_logo));
    }


    try {
        if (currentMovie.getMoviePurchaseDetail() == Movie.PURCHASE_BOUGHT) {
            holder.tagImage.setBackground(context.getResources().getDrawable(R.drawable.tag_upgrade));

        } else if (currentMovie.getMoviePurchaseDetail() == Movie.PURCHASE_BUY) {
            holder.tagImage.setBackground(context.getResources().getDrawable(R.drawable.tag_buy));

        } else if(currentMovie.getMoviePurchaseDetail() == Movie.PURCHASE_DEFAULT) {
            holder.tagImage.setBackgroundResource(0);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }


}

@Override
public int getItemCount() {
    return movieList.size();
}



public static class ViewHolder extends RecyclerView.ViewHolder {

    private TextView textView;
    private ImageView imageView, tagImage;

    public ViewHolder(View itemView) {
        super(itemView);
        textView = (TextView) itemView.findViewById(R.id.textView);
        imageView = (ImageView) itemView.findViewById(R.id.imageView);
        tagImage = (ImageView) itemView.findViewById(R.id.tag);


    }

}

For the on item click of the recycler view i am doing it this way :

HorizontalRecyclerViewAdapter adapter = new HorizontalRecyclerViewAdapter(context, categoryMovieList);
    holder.hListView.setAdapter(adapter);


    final GestureDetector mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {

        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            return true;
        }

    });

    holder.hListView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
        @Override
        public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
            View child = recyclerView.findChildViewUnder(motionEvent.getX(), motionEvent.getY());
            if (child != null && mGestureDetector.onTouchEvent(motionEvent)) {

                int position = recyclerView.getChildPosition(child);
                final Movie movie = categoryMovieList.get(position);

                if(movie.getMoviePurchaseDetail() == Movie.PURCHASE_DEFAULT) {

                    LinkConfig
                            .loadMovieLink(context, movie);

                }else if(movie.getMoviePurchaseDetail()==Movie.PURCHASE_BOUGHT){

                    final CustomDialogManager bought_dialog = new CustomDialogManager(
                            context,
                            "You have already bought this movie. Please Upgrade",
                            CustomDialogManager.MESSAGE);
                    bought_dialog.build();
                    bought_dialog.show();
                    bought_dialog.setPositiveButton("PLAY NOW", new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {

                            LinkConfig
                                    .loadMovieLink(context, movie);
                            bought_dialog.dismiss();
                        }
                    });

                    bought_dialog.setNegativeButton("OK",
                            new View.OnClickListener() {

                                @Override
                                public void onClick(View v) {
                                    // TODO Auto-generated method stub
                                    bought_dialog.dismiss();
                                    MultipleUsedMethods.showBuyDialog(
                                            context, movie);

                                }
                            });

                }else {
                    MultipleUsedMethods.showBuyDialog(
                            context, movie);
                }

                return true;

            }
            return false;
        }

        @Override
        public void onTouchEvent(RecyclerView rv, MotionEvent e) {

        }

        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

        }
    });

What might be the reason for this?


回答1:


Similarly, I face the same problem of listener didn't get position. You can try this code:-

private Context context;
private ArrayList<Movie> movieList;

public HorizontalRecyclerViewAdapter(Context context,
                                   ArrayList<Movie> objects) {
    this.context = context;
    this.movieList = objects;
}


@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.movie_item, null);
    return new ViewHolder(v);
}

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onBindViewHolder(ViewHolder holder, int position) {



    Movie currentMovie = movieList.get(position);

    holder.textView.setText(currentMovie.getMovieName());


    //Logger.e("THE MOVIE NAME" , currentMovie.getMovieName());

    try {
        UrlImageViewHelper.setUrlDrawable(holder.imageView, currentMovie.getMoviePictureLinkString(), R.drawable.placeholder_logo);
    } catch (Exception e) {
        holder.imageView.setImageDrawable(context.getResources().getDrawable(R.drawable.placeholder_logo));
    }


    try {
        if (currentMovie.getMoviePurchaseDetail() == Movie.PURCHASE_BOUGHT) {
            holder.tagImage.setBackground(context.getResources().getDrawable(R.drawable.tag_upgrade));

        } else if (currentMovie.getMoviePurchaseDetail() == Movie.PURCHASE_BUY) {
            holder.tagImage.setBackground(context.getResources().getDrawable(R.drawable.tag_buy));

        } else if(currentMovie.getMoviePurchaseDetail() == Movie.PURCHASE_DEFAULT) {
            holder.tagImage.setBackgroundResource(0);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    holder.v.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
                //Put your code here
        }
    }); 


}

@Override
public int getItemCount() {
    return movieList.size();
}



public static class ViewHolder extends RecyclerView.ViewHolder {

    private TextView textView;
    private ImageView imageView, tagImage;
    View v;

    public ViewHolder(View itemView) {
        super(itemView);
        textView = (TextView) itemView.findViewById(R.id.textView);
        imageView = (ImageView) itemView.findViewById(R.id.imageView);
        tagImage = (ImageView) itemView.findViewById(R.id.tag);
        v = itemView;

    }

}



回答2:


You can also use

holder.getAdapterPosition();



回答3:


First add below code to your adapter class:

    public class HorizontalRecyclerViewAdapter extends RecyclerView.Adapter<HorizontalRecyclerViewAdapter.ViewHolder>{

        public interface OnMyItemClickLitner{
            void onItemClick(View v, int position);
        }

        private OnMyItemClickLitner mOnMyItemClickLitner;
        private Context context;
        private ArrayList<Movie> movieList;

        public HorizontalRecyclerViewAdapter(Context context,
                                             ArrayList<Movie> objects, OnMyItemClickLitner onMyItemClickLitner) {
            this.context = context;
            this.movieList = objects;
            mOnMyItemClickLitner = onMyItemClickLitner;
        }
//your code 
    }

then change you ViewHolder class as below:

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        private TextView textView;
        private ImageView imageView, tagImage;

        public ViewHolder(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.textView);
            imageView = (ImageView) itemView.findViewById(R.id.imageView);
            tagImage = (ImageView) itemView.findViewById(R.id.tag);

            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            mOnMyItemClickLitner.onItemClick(v, getAdapterPosition());
        }
    }

And then call adapter constructor as below in your activity:

HorizontalRecyclerViewAdapter adapter = new HorizontalRecyclerViewAdapter(context, categoryMovieList, new HorizontalRecyclerViewAdapter.OnMyItemClickLitner() {
            @Override
            public void onItemClick(View v, int position) {
                //your code goes here
            }
        });



回答4:


holder.getAdapterPosition(); or holder.setIsRecyclable(false);

You can use any one of them.



来源:https://stackoverflow.com/questions/34487921/recycler-view-not-giving-the-correct-position-after-scrolling

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!