我希望能够动态地将项目添加到我的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
谢谢! :)
答案 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中,而是将接口传递给它,这样逻辑就可以保存在更加集中的位置,就像演示者一样。