RecyclerView - 单个选项每10行选择一次

时间:2016-11-10 18:04:21

标签: android android-studio onclick android-recyclerview

这很奇怪,但是当我使用我的代码长时间点击一行时,该行上的星形变为金色(这就是我想要的),但每个星形相隔十行。 这是我的代码:

    public class MyViewHolder extends RecyclerView.ViewHolder {
    public TextView localeDisplay;
    private static final int grey_blue = 0xff546E7A;
    private static final int gold = 0xffffa000;

    public MyViewHolder(final View view) {
        super(view);
        localeDisplay = (TextView) view.findViewById(R.id.languageText);

        view.setOnClickListener(new View.OnClickListener() {

                                    @Override
                                    public void onClick(View view) {
                                        Languages currentLanguages = languagesList.get(getAdapterPosition());
                                        Snackbar snackbar;
                                        snackbar = Snackbar.make(view, currentLanguages.getLocaleDisplay() + " selected", Snackbar.LENGTH_INDEFINITE)
                                                .setAction("Next", new View.OnClickListener() {
                                                    @Override
                                                    public void onClick(View v) {
                                                        Intent intent = new Intent(v.getContext(), MainActivity.class);
                                                        v.getContext().startActivity(intent);
                                                    }
                                                });
                                        View snackBarView = snackbar.getView();
                                        snackBarView.setBackgroundColor(grey_blue);
                                        snackbar.show();
                                    }
                                }

        );

        view.setOnLongClickListener(new View.OnLongClickListener()

                                    {
                                        @Override
                                        public boolean onLongClick(View v) {
                                            Toast.makeText(v.getContext(), "Position is " + getAdapterPosition(), Toast.LENGTH_SHORT).show();

                                            ImageView star = (ImageView) view.findViewById(R.id.imageView);

                                            if (star.getColorFilter() == null) {
                                                star.setColorFilter(gold);
                                            } else star.clearColorFilter();

                                            return true;
                                        }
                                    }

        );
    }

我尝试过this tutorial,但会发生同样的行为。 我有什么想法可以纠正这个问题吗?

3 个答案:

答案 0 :(得分:0)

这是因为您获得了R.id.imageView个ID的所有项目。要做你想做的事,你需要抓住被点击的项目,只改变所选行的颜色;

答案 1 :(得分:0)

似乎您的视图正在被回收,这意味着您的侦听器引用被调用到所有回收的视图。

解决此问题的一种简单方法是在onBindViewHolder方法中为每个单独的视图设置新的引用。通常,Viewholder用于查找视图并保留回收视图的引用,在其中设置数据不是一个好主意。

您可以更改以下视图:

public ExampleViewHolder(View view) {
        super(view);
        myContainer = (LinearLayout) view.findViewById(R.id.myContainer);
        localeDisplay = (TextView) view.findViewById(R.id.languageText);
        star = (ImageView) view.findViewById(R.id.imageView);
    }

并将侦听器设置为onBindViewHolder:

@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {

    ExampleHolder holder = (ExampleHolder) viewHolder;

    //Insert the position reference
    holder.myContainer.setTag(position);

    // Setting listeners
    holder.myContainer.setOnClickListener(this);
    holder.myContainer.setOnLongClickListener(this); 

}

然后在适配器上实现OnLongClickListener和OnClickListener。

@Override
public boolean onLongClick(View v) {

    //Getting position
    int position = (int)v.getTag();

    //Insert your code
    return false;
}

@Override
public void onClick(View v) {
    //code here
}

如果有效,请给我留言。祝你好运。

答案 2 :(得分:0)

在您的适配器构造函数中,只需添加此部分:

setHasStableIds(true).

然后覆盖适配器类中的以下方法。

 @Override
   public long getItemId(int position) {
      return position;
   }

 @Override
  public int getItemViewType(int position) {
     return position;
  }