RecyclerView数据经过多次修改/显示

时间:2015-05-08 13:15:53

标签: android adapter onclicklistener android-recyclerview android-viewholder

我的RecyclerView存在一个小问题。我的适配器充满了一些TextView,ImageView和一些按钮。当其中一个按钮上有一个OnClick-Event时,它会修改一个TextView - 到目前为止一直很好但是当我滚动一些项目时,另一个RecyclerView项目也被修改并具有最初修改的值一。

我已经尝试将setOnClickListener移动到我的ViewHolder中,但结果是一样的。

可能你可以帮助我。

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    // some vars .... and a constructor

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.recyclerview_item, viewGroup, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final ViewHolder viewHolder, final int i) {
        // ...

        viewHolder.myTextView.setText("clear");
        viewHolder.myButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewHolder.myTextView.setText("modified");
            }
        });

        // ...
    }

    @Override
      public int getItemCount() {
        return mProducts.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {
        private TextView productMultibuy;
        private Button productAddToShoppingList;

        // ...
        public ViewHolder(View itemView) {
            super(itemView);

            myTextView = (TextView) itemView.findViewById(R.id.my_textview);
            myButton = (Button) itemView.findViewById(R.id.my_button);

            // ...


            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                }
            });


            itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    return false;
                }
            });

        }
     }
}

2 个答案:

答案 0 :(得分:0)

here阅读。

RecyclerView与ListView和GridView一样,尽可能重用视图。这意味着当您滚动时,从顶部掉落的视图将用于底部的视图等。这极大地提高了内存效率和滚动性能。这意味着如果您没有重置新项目的所有状态,您将看到上次使用此视图时遗留的状态。

  

始终重置所有状态

答案 1 :(得分:0)

谢谢,但我用setTag()和getTag()

解决了这个问题

公共类MyAdapter扩展了RecyclerView.Adapter {

// some vars .... and a constructor

@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(mContext).inflate(R.layout.recyclerview_item, viewGroup, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int i) {
    // ...
}

@Override
  public int getItemCount() {
    return mProducts.size();
}

public class ViewHolder extends RecyclerView.ViewHolder {
    private TextView productMultibuy;
    private Button productAddToShoppingList;

    // ...
    public ViewHolder(View itemView) {
        super(itemView);

        myTextView = (TextView) itemView.findViewById(R.id.my_textview);
        myTextView.setTag(this);
        myButton = (Button) itemView.findViewById(R.id.my_button);
        myButton.setTag(this);

        // ...

        myButton.getTag();
        myButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                    myTextView.getTag();
                    myTextView.setText(String.valueOf(amount));
                }
            }
        });


    }
 }

}