【问题标题】:RecyclerView binded to FirebaseRecyclerAdapter, wrong row deleted when checked a checkboxRecyclerView 绑定到 FirebaseRecyclerAdapter,选中复选框时删除了错误的行
【发布时间】:2016-04-08 12:47:54
【问题描述】:

我将recyclerView 绑定到FirebaseRecyclerAdapter,并为ViewHolder 中的复选框设置OnClickListener

我的想法:
选中一行的复选框时,适配器将getRef(clickedPosition)并致电removeValue从Firebase数据库中删除该行。之后,调用populateViewHolder,应用程序将显示数据库中的最新数据。

问题: 如果我从列表底部向上删除,则没有问题。 但是,如果随机选中复选框,似乎会删除错误的行,有时甚至会出现NULL 位置并导致Android 应用程序崩溃。 我已经记录了位置,似乎在删除一行后复选框的位置没有正确更新。

这是我的代码:

public Firebase mRef;

// UI
RecyclerView mRecyclerView;

FirebaseRecyclerAdapter<Task, MessageViewHolder> adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_my_task);
   ...
   ...
   Firebase.setAndroidContext(this);
   mRef = new Firebase("https://what-to-do-list.firebaseio.com/todoItems");

   mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
   mRecyclerView.setHasFixedSize(true);
   mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
}


@Override
protected void onStart() {
    super.onStart();

    adapter =
            new FirebaseRecyclerAdapter<Task, MessageViewHolder>(
                    Task.class,
                    R.layout.custom_row_view,
                    MessageViewHolder.class,
                    mRef
            ) {
                @Override
                protected void populateViewHolder(MessageViewHolder messageViewHolder, Task t, int i) {

                    messageViewHolder.mText.setText(t.getName());
                    messageViewHolder.chkBox.setTag(i);

                    messageViewHolder.chkBox.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            CheckBox cb = (CheckBox) v;
                            int clickedPos = ((Integer) cb.getTag()).intValue();


                            Log.v("POSITION: ", String.valueOf(clickedPos));
                            adapter.getRef(clickedPos).removeValue();
                        }
                    });
                }      
            };
    mRecyclerView.setAdapter(adapter);
}

@JsonIgnoreProperties(ignoreUnknown = true)
public static class MessageViewHolder
        extends RecyclerView.ViewHolder {
    TextView mText;
    CheckBox chkBox;

    public MessageViewHolder(View v) {
        super(v);
        mText = (TextView) v.findViewById(R.id.list_item_name);
        chkBox = (CheckBox) v.findViewById(R.id.task_chkbox);
    }
}

【问题讨论】:

    标签: android firebase android-recyclerview firebaseui


    【解决方案1】:

    将您的 populateViewHolder 更改为:

    @Override
    protected void populateViewHolder(MessageViewHolder messageViewHolder, Task t, int i) {
    
        final DatabaseReference ref = getRef(i);
        messageViewHolder.mText.setText(t.getName());
        messageViewHolder.chkBox.setTag(ref);
    
        messageViewHolder.chkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                CheckBox cb = (CheckBox) v;
                String key = cb.getTag().getKey();
    
                adapter.getRef(key).removeValue();
             }
         });
    

    【讨论】:

      【解决方案2】:

      问题是,在回收站视图中删除一个元素时,剩余元素的位置没有得到更新。因此,使用“i”作为索引是错误的。相反,使用:

      messageViewHolder.getAdapterPosition()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-14
        • 1970-01-01
        • 1970-01-01
        • 2021-08-30
        • 1970-01-01
        • 1970-01-01
        • 2012-03-03
        相关资源
        最近更新 更多