【问题标题】:RecyclerView doesn't refresh after Firebase updateFirebase 更新后 RecyclerView 不刷新
【发布时间】:2019-08-12 22:24:10
【问题描述】:

我有一个 RecyclerView,对于每个项目,您可以启动 EditActivity(用于结果)以使用 Firebase 更新您的文本。

问题是当你回到RecyclerView时,数据没有刷新

这是来自我的适配器的代码:

holder.editBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent edit_intent = new Intent(holder.authorText.getContext(), EditActivity.class);
                    edit_intent.putExtra("text", textList.get(position).getBody());
                    edit_intent.putExtra("id", textList.get(position).textId);
                    ((Activity) context).startActivityForResult(edit_intent, 1);
                }
            });

 public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 1) {
            if(resultCode == RESULT_OK){
                notifyDataSetChanged();
            }
        }
    }

这是我的 EditActivity 中的代码:

edit_btn.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        mProgress.setVisibility(View.VISIBLE);
        edit_btn.setVisibility(View.INVISIBLE);
        String new_text = edit_text.getText().toString();
        mFirestore.collection("Text").document(text_id).update("body", new_text).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if(task.isSuccessful()){
                    Toast.makeText(EditActivity.this, R.string.changes, Toast.LENGTH_LONG).show();
                    Intent intent = new Intent();
                    intent.putExtra("newText", new_text);
                    setResult(RESULT_OK, intent);
                    finish();
                }
                else{
                    String error = task.getException().getMessage();
                    Toast.makeText(EditActivity.this, R.string.error + error, Toast.LENGTH_LONG).show();
                }
                mProgress.setVisibility(View.INVISIBLE);
                edit_btn.setVisibility(View.VISIBLE);
            }
        });
    }
});

如何用新的 Text 刷新 RecyclerView 和 setText ?

非常感谢您的帮助:)

【问题讨论】:

  • 我认为 onActivityResult() 需要进入你的 EditActivity 而不是你的适配器
  • 购买如何从 EditActivity 刷新 RecyclerView ?
  • 还请说明如何将数据绑定到回收站视图。 Ali Ihsan 的解决方案可能有效,但可能有一种更短、更清洁的方法。

标签: java android firebase android-recyclerview google-cloud-firestore


【解决方案1】:

你做错的事情很少。

  1. 将 clickedItem 位置传递给 EditActivity 以便稍后更新。

    holder.editBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent edit_intent = new Intent(holder.authorText.getContext(), EditActivity.class);
                edit_intent.putExtra("text", textList.get(position).getBody());
                edit_intent.putExtra("id", textList.get(position).textId);
                edit_intent.putExtra("position", position);
                ((Activity) context).startActivityForResult(edit_intent, 1);
            }
        });
    
  2. EditActivity 中,将位置保存在变量中并用新文本返回

    setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mProgress.setVisibility(View.VISIBLE);
                edit_btn.setVisibility(View.INVISIBLE);
                String new_text = edit_text.getText().toString();
                mFirestore.collection("Text").document(text_id).update("body", new_text).addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if(task.isSuccessful()){
                            Toast.makeText(EditActivity.this, R.string.changes, Toast.LENGTH_LONG).show();
                            Intent intent = new Intent();
                            intent.putExtra("newText", new_text);
                            //Return the position s well
                            intent.putExtra("position", position);
                            setResult(RESULT_OK, intent);
                            finish();
                        }
                        else{
                            String error = task.getException().getMessage();
                            Toast.makeText(EditActivity.this, R.string.error + error, Toast.LENGTH_LONG).show();
                        }
                        mProgress.setVisibility(View.INVISIBLE);
                        edit_btn.setVisibility(View.VISIBLE);
                    }
                });
            }
        });
    
  3. 在适配器的父活动中覆盖 onActivityResult()

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 1) {
            if(resultCode == RESULT_OK){
    
              String newText = data.getStringExtra("newText");
              int itemPosition = data.getIntExtra("position");
    
              //Pass these values to adapter through `updateItem` method
                adapter.updateItem(newText, itemPosition);
            }
        }
    }
    
  4. 在适配器类中定义updateItem方法

    public void updateItem(String newData, int index)
    {
      textList.set(index, newData);
      adapter.notifyItemChanged(index);
    }
    

干杯:)

【讨论】:

  • 非常感谢 :)
  • 不客气 :) 如果有帮助,请接受答案
  • 对不起,我不知道这个工具:)
猜你喜欢
  • 1970-01-01
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多