Recycler View does not give correct position after scrolling

I used a GridView with 1 column count and the adapter used, in which I use recyclerView to scroll horizontally. To be clear, I have gridview as the main view in which recyclerview is used in the adapter. All elements are displayed in the view accordingly, but after I scroll through the position that I get, this is not the correct position. Adapter for viewing recyclers:

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);


    }

}

To click the recycler object, I do this as follows:

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 could be the reason for this?

+1
source share
4 answers

, , . : -

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;

    }

}
+3

holder.getAdapterPosition();
+2

First add the code below to the 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 the ViewHolder class as follows:

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 create the call adapter constructor as shown below:

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

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

You can use any of them.

0
source

Source: https://habr.com/ru/post/1621936/


All Articles