动态添加项目到RecyclerView

时间:2017-01-22 00:54:30

标签: android android-recyclerview

我希望能够动态地将项目添加到我的ReclycerView。

当项目加载时 - > setText() - >我在列表中添加了另一个项目。

@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
    final Message message = mDataset.get(position);

    if(message.isAnswers()) {
        holder.mAnswer1Button.setText(message.getAnswer1());
        holder.mAnswer2Button.setText(message.getAnswer2());

        holder.mAnswer1Button.setOnClickListener(v -> {
            if(message.getChild1() > 0) {
                add(position + 1, dataListShared.get(message.getChild1()));
                holder.mAnswer1Button.setClickable(false);
                holder.mAnswer2Button.setEnabled(false);
            }
        });
    } else {
        holder.mMessageTextView.setText(message.getMessage());
            if(message.getChild1() > 0) {
                add(position + 1, dataListShared.get(message.getChild1()));
                holder.mMessageTextView.setEnabled(false);
            }
    }
}

这就是onBindViewHolder中的内容。当我处于第一个案例if()时,单击按钮,该项目将添加到列表中。在第二个案例else()上,我希望在当前项目上设置文本,而不是已添加另一个案例。

我怎样才能做到这一点?

此外,为什么add()在onClickListener内部工作但不在其外部?

我得到的错误是:

java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling

谢谢! :)

2 个答案:

答案 0 :(得分:1)

错误本身就是自我解释的...... setOnClickListener中的onBindViewHolder是危险的。此方法是刷新每个回收商项目的步骤。

您应该将方法setOnClickListener移动到适配器内部类的ViewHolder

class MyViewHolder extends RecyclerView.ViewHolder
    {
        private final OnClickListener mOnClickListener = new MyOnClickListener();
        Button mAnswer1Button, mAnswer2Button;
        public MyViewHolder (View itemView) {
            super(itemView);
            mAnswer1Button = (Button) itemView.findViewById(R.id.item);
            mAnswer2Button = (Button) itemView.findViewById(R.id.item);
            mAnswer1Button.setOnClickListener(mOnClickListener);

        }


       @Override
       public void onClick(final View view) {
            //Now your Logic ....
       }
    }

您可以做的另一件事是设置创建界面OnItemClickListener 并声明onItemClick,然后从您为特定回收站视图implment OnItemClickListener设置适配器的位置开始活动,在那里您可以再次动态添加另一个项目setAdapter或{ {1}}

你的InterFace

notifyDataSetChanged()

您的MainActivity

 public interface OnItemClickListener{
      public void onItemClick(int position);
 }

现在,您可以通过在 class MainActivity implements OnItemClickListener{ RecyclerView mRecyclerView ; @Override public void onCreate(Bundle savedInstanceState) { setContentView(R.layout.layout); mRecyclerView = (RecyclerView ) findViewById(R.id.recyclerview); mAdapter= new MyAdapter(ArrayList, getContext(), MainActivity.this); } @Overrride public void onItemClick(int position) { //Now your Logic .... } } 类中设置onItemClick mAnswer1Button并在Adpater中调用此方法,从onClickListener条中调用此方法ViewHolder

答案 1 :(得分:0)

如评论所述,我认为它应该像这样工作:

private int position;

@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
    this.position = position;
}


@Override
public void onViewAttachedToWindow(ViewHolder holder) {
    final Message message = mDataset.get(position);

    if(message.isAnswers()) {
        holder.mAnswer1Button.setText(message.getAnswer1());
        holder.mAnswer2Button.setText(message.getAnswer2());

        holder.mAnswer1Button.setOnClickListener(v -> {
            if(message.getChild1() > 0) {
                add(position + 1, dataListShared.get(message.getChild1()));
                holder.mAnswer1Button.setClickable(false);
                holder.mAnswer2Button.setEnabled(false);
            }
        });
    } else {
        holder.mMessageTextView.setText(message.getMessage());
            if(message.getChild1() > 0) {
                add(position + 1, dataListShared.get(message.getChild1()));
                holder.mMessageTextView.setEnabled(false);
            }
    }
}

在onBindViewHolder()中,你显然无法更改数据集 - 我猜测框架仍在忙于显示以前的数据集。但是当在实例变量中保存位置并更新onViewAttachedToWindow()中的数据集时,RecylerView应准备好接收更多数据。

说实话,我不会将所有这些逻辑添加到ViewHolder中,而是将接口传递给它,这样逻辑就可以保存在更加集中的位置,就像演示者一样。