问题
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