亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當從另一個活動中按下排序按鈕時,Android 中的 RecyclerView 會變成空白

當從另一個活動中按下排序按鈕時,Android 中的 RecyclerView 會變成空白

小唯快跑啊 2023-09-27 10:27:16
好的,我正在嘗試對從 XML 開始初始化的 recyclerView 進行排序。當我啟動應用程序時,我可以看到電子郵件,也可以單擊它們。排序按鈕位于“設置”活動中,但每當我回到 RecyclerView 所在的主要活動時,單擊該按鈕后,我的 recyclerView 就會變成空白。這是我的主要活動package com.example.assignment_1;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.provider.ContactsContract;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import androidx.appcompat.app.AppCompatActivity;import androidx.recyclerview.widget.LinearLayoutManager;import androidx.recyclerview.widget.RecyclerView;import java.util.ArrayList;import java.util.Collection;import java.util.Collections;import java.util.Comparator;public class MainActivity extends AppCompatActivity {    private static final String TAG = "MainActivity";    //Variables    private ArrayList<String> mNames = new ArrayList<>();    private ArrayList<String> mImageurls = new ArrayList<>();    private ArrayList<String> mHeaders = new ArrayList<>();    private ArrayList<String> mContent = new ArrayList<>();    static ArrayList<AssignmentEmail> emails = new ArrayList<>();    private RecyclerViewAdapdter adapter;    private RecyclerView recyclerView;    private Context mContext;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        EmailProvider emailProvider = new EmailProvider();        Context context = getApplicationContext();        if(emails.isEmpty() == true){            emails = emailProvider.getEmails(context);            loadEmails();        }    }
查看完整描述

2 回答

?
慕沐林林

TA貢獻2016條經驗 獲得超9個贊

從你的MainActivity調用中Settings使用startActivityForResult()方法


例如:


    if (id == R.id.action_settings){

        Intent intent = new Intent(getApplicationContext(), Settings.class);

        startActivityForResult(intent,1);

        return true;

    }

在您Settings Activity設置要返回的數據MainActivity。如果您不想返回,請不要設置。


resetButton.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

                Intent returnIntent = new Intent();

                setResult(Activity.RESULT_OK,returnIntent);

                finish();

            }

        });

現在您main activity必須為該onActivityResult()方法編寫以下代碼。


@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {


    if (requestCode == 1) {

        if(resultCode == Activity.RESULT_OK){

            // here you can sorting your recyclerview

            sortEmails(getEmails());

        }

        if (resultCode == Activity.RESULT_CANCELED) {

            //Write your code if there's no result

        }

    }

}

其他方式


如果您不想在單擊setting activity后終止resetbutton,則可以使用shared preference.


例子


public class SharedPrefManager{

  private static SessionManager jInstance;

  private final SharedPreferences prefs;

  private final SharedPreferences.Editor editor;


  // private constructor to force use of 

  // getInstance() to create Singleton object 

  private SharedPrefManager(Context context) {

      prefs = context.getSharedPreferences("Your_Preference_name", Context.MODE_PRIVATE);

      editor = prefs.edit();

  }


  // create the instance when it is accessed for the first time

  public static synchronized SharedPrefManager getInstance(Context context) {

      if (jInstance != null) {

          return jInstance;

      } else {

          jInstance = new SharedPrefManager(context);

          return jInstance;

      }

  }


  

  public void isSortedByEmail(boolean emailSorting){

      editor.putString("emailSorting",emailSorting);

      editor.apply();

  }


 

  public boolean isSortedByEmail(){

      return prefs.getBoolean("emailSorting",false);

  }

}

在你的setting activity你必須像下面這樣做


resetButton.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View view) {

      SharedPrefManager.getInstance(context).isSortedByEmail(true);

    }

});

而在你的main activity內心onStart()


@Override

protected void onStart(){

   super.onStart();

   if(SharedPrefManager.getInstance(context).isSortedByEmail()){

     // here you can sorting your recyclerview

     sortEmails(getEmails());

   }

}


查看完整回答
反對 回復 2023-09-27
?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

如果您仍然想從設置活動刷新回收器視圖,請使用此庫。

https://github.com/greenrobot/EventBus

實施鏈接

https://stackoverflow.com/a/40987755/6452937

您無法在您提到的活動之間進行通信。


查看完整回答
反對 回復 2023-09-27
?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

您在“設置”中進行了初始化,但該參考與顯示的MainActivity實際參考不同。MainActivity我發現適配器中與數據集相關的一些其他問題需要改進。Settings之后,您需要找到一種可以將過濾器信息從 發送到的方法MainActivity。有多種方法,但我建議您在您的情況下使用 SharedPreference。


您Settings應該將過濾器設置放入SharedPreference并獲取它們的值MainActivity


public class Settings extends AppCompatActivity {


    SharedPreferences.Editor editSettings;


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        ...

        editSettings = getSharedPreferences("filter", Context.MODE_PRIVATE).edit();

        resetButton.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

                editSettings.putBoolean("reset", true).apply();

            }

        });

    }

}

在進行Adapter以下更改時,


public class RecyclerViewAdapdter extends RecyclerView.Adapter<RecyclerViewAdapdter.ViewHolder>  {


    private static final String TAG = "RecyclerViewAdapter";

    private ArrayList<String> mImages = new ArrayList<>();

    private ArrayList<String> mEmailTitle = new ArrayList<>();

    private ArrayList<String> mEmailHeader = new ArrayList<>();

    private ArrayList<String> mEmailContent = new ArrayList<>();

    private Context mContext;


    public RecyclerViewAdapdter(Context mContext) {

        this.mContext = mContext;

    }


    public void submitData((ArrayList<String> mImages, ArrayList<String> mEmailTitle, ArrayList<String> mEmailHeader, ArrayList<String> mEmailContent) {

        this.mImages.clear();

        this.mEmailTitle.clear();

        this.mEmailHeader.clear();

        this.mEmailContent.clear();


        this.mImages.addAll(mImages);

        this.mEmailTitle.addAll(mEmailTitle);

        this.mEmailHeader.addAll(mEmailHeader);

        this.mEmailContent.addAll(mEmailContent);


        notifyDataSetChanged()

    }


    ...

}

在MainActivity覆蓋onResume()和更新列表中,當 SharedPreference 的值為 true 時,


public class MainActivity extends AppCompatActivity {


    ...


    SharedPreferences spSettings;


    @Override

    protected void onCreate(@Nullable Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        spSettings = getSharedPreferences("filter", Context.MODE_PRIVATE);


        ...

    }


    @Override

    protected void onResume() {

        super.onResume();

        boolean reset = spSettings.getBoolean("reset", false);

        if(reset) {

            ArrayList<AssignmentEmail> emailArray = getEmails();

            sortEmails(emailArray);

        }

    }


    private void initRecyclerView(){

        ...


        adapter = new RecyclerViewAdapdter(mContent,this);

        adapter.submitData(mImageurls,mNames,mHeaders);


        ...

    }


    public void sortEmails(ArrayList<AssignmentEmail> arrayOfEmails){

        ...


        adapter.submitData(mImageurls,mNames,mHeaders,mContent);

    }


}


查看完整回答
反對 回復 2023-09-27
  • 2 回答
  • 0 關注
  • 176 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號