简体   繁体   English

Firebase更新后,RecyclerView不刷新

[英]RecyclerView doesn't refresh after Firebase update

I have a RecyclerView and for each item, you can start the EditActivity (for Result) to update your text with Firebase. 我有一个RecyclerView,对于每个项目,您都可以启动EditActivity(用于Result)以使用Firebase更新文本。

The problem is that when you come back to the RecyclerView, data is not refreshed 问题是,当您返回到RecyclerView时,不会刷新数据

Here's code from my adapter : 这是我的适配器中的代码:

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();
            }
        }
    }

Here's code from my EditActivity : 这是我的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);
            }
        });
    }
});

How to refresh the RecyclerView and setText with the new Text ? 如何使用新的Text刷新RecyclerView和setText?

I would be very grateful for your help :) 我将非常感谢您的帮助:)

There are few things you're doing wrong. 您做错的事情很少。

  1. Pass the clickedItem position to EditActivity to update it later on. 将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. In EditActivity , Save the position in a variable & Return it back with new text 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. override onActivityResult() in your adaptor's parent activity 在适配器的父活动中覆盖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. Define the updateItem method inside adapter class 在适配器类中定义updateItem方法

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

Cheers :) 干杯:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM