android - 滚动后 Recycler View 没有给出正确的位置

标签 android android-recyclerview

我使用了列数为 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/

相关文章:

android - E/回收站 View : No adapter attached; skipping layout (Using FRAGMENTS)

android - 从 Firebase 数据库中回收 ListView 中的 View 的好方法是什么

java - 地理编码器 getfromlocationName 使应用程序崩溃

Android map 应用程序崩溃

android - 如何在 Android 运行时更改方向时保持弹出窗口打开?

android - RecyclerView 滚动条滞后

Java 计数 Realm 结果

java - Firebase 节点更新时接收通知

android - 使用 Kotlin 从 RecyclerAdapter 更改 MainActvity 中的 TextView

java - "Transform variable into final one element array"。 RecyclerView 滚动监听器出现错误