我使用了列数为 1 的 GridView,并使用了我在其中使用 recyclerView 进行水平滚动的适配器。需要明确的是,我有一个 gridview 作为主视图,其中在适配器中使用了 recyclerview。所有元素都相应地显示在 View 中,但是在我滚动后我得到的位置不是正确的位置。回收器 View 的适配器是:
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);
}
}
对于回收站 View 的项目点击,我是这样做的:
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) {
}
});
这可能是什么原因?
最佳答案
同样,我也遇到了监听器没有定位的问题。 你可以试试这段代码:-
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;
}
}
关于android - 滚动后 Recycler View 没有给出正确的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34487921/