[英]RecyclerView in Android goes blank when pressing sort button from another activity
好的,所以我正在嘗試對從 XML 開始初始化的 recyclerView 進行排序。 我可以在啟動應用程序時看到電子郵件,也可以單擊它們。 排序按鈕位於設置活動中,但是每當我回到我的 RecyclerView 所在的主要活動時,單擊按鈕后,我的 recyclerView 就會變為空白。
這是我的 MainActivity
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();
}
}
private void loadEmails(){
Log.d(TAG, "loadEmails: initBitmaps Called");
for(int i = 0; i < emails.size(); i++) {
mImageurls.add("@drawable/e1.jpg");
mNames.add(emails.get(i).getAuthor());
mHeaders.add(emails.get(i).getTitle());
mContent.add(emails.get(i).getBody());
}
initRecyclerView();
}
public static ArrayList<AssignmentEmail> getEmails(){
return emails;
}
public void sortEmails(ArrayList<AssignmentEmail> arrayOfEmails){
Comparator<AssignmentEmail> compareByAuthor = (AssignmentEmail o1, AssignmentEmail o2) -> o1.getAuthor().compareTo( o2.getAuthor());
Collections.sort(arrayOfEmails, compareByAuthor);
mImageurls.clear();
mNames.clear();
mHeaders.clear();
mContent.clear();
for(int i = 0; i < arrayOfEmails.size(); i++) {
mImageurls.add("@drawable/e1.jpg");
mNames.add(arrayOfEmails.get(i).getAuthor());
mHeaders.add(arrayOfEmails.get(i).getTitle());
mContent.add(arrayOfEmails.get(i).getBody());
}
adapter = new RecyclerViewAdapdter(mImageurls,mNames,mHeaders,mContent,this);
adapter.notifyDataSetChanged();
}
private void initRecyclerView(){
Log.d(TAG, "initRecyclerView: init RecyclerView");
recyclerView = findViewById(R.id.recyclerview);
adapter = new RecyclerViewAdapdter(mImageurls,mNames,mHeaders,mContent,this);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate activity menu items.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
int id = item.getItemId();
if (id == R.id.action_settings){
Intent intent = new Intent(getApplicationContext(), Settings.class);
startActivity(intent);
return true;
}
return super.onOptionsItemSelected(item);
}
}
這是我的 RecyclerViewAdapter
package com.example.assignment_1;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import de.hdodenhof.circleimageview.CircleImageView;
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(ArrayList<String> mImages, ArrayList<String> mEmailTitle, ArrayList<String> mEmailHeader, ArrayList<String> mEmailContent, Context mContext) {
this.mImages = mImages;
this.mEmailTitle = mEmailTitle;
this.mEmailHeader = mEmailHeader;
this.mEmailContent = mEmailContent;
this.mContext = mContext;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
Log.d(TAG, "onBindViewHolder: Called");
Glide.with(mContext)
.asBitmap()
.load(mImages.get(position))
.into(holder.Image);
holder.email_from.setText(mEmailTitle.get(position));
holder.email_header.setText(mEmailHeader.get(position));
holder.email_contents.setText(mEmailContent.get(position));
holder.Email_interface.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Log.d(TAG, "onClick: Email Clicked");
//Toast.makeText(mContext, mEmailTitle.get(position),Toast.LENGTH_SHORT).show();
Intent intent = new Intent(mContext.getApplicationContext(), LayoutItemsActivity.class);
intent.putExtra("EmailFrom",mEmailTitle.get(position));
intent.putExtra("EmailHeader",mEmailHeader.get(position));
intent.putExtra(("EmailContents"),mEmailContent.get(position));
mContext.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return mEmailTitle.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
CircleImageView Image;
TextView email_from;
TextView email_header;
TextView email_contents;
RelativeLayout Email_interface;
public ViewHolder(@NonNull View itemView) {
super(itemView);
Image = itemView.findViewById(R.id.image);
email_from = itemView.findViewById(R.id.EmailFrom);
email_header = itemView.findViewById(R.id.EmailHeader);
email_contents = itemView.findViewById(R.id.EmailContents);
Email_interface = itemView.findViewById(R.id.email_interface);
}
}
}
這是我的按鈕所在的位置
package com.example.assignment_1;
import android.content.Intent;
import android.os.Bundle;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import java.util.ArrayList;
public class Settings extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Button resetButton = findViewById(R.id.button2);
resetButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MainActivity mainActivity = new MainActivity();
ArrayList<AssignmentEmail> emailArray = mainActivity.getEmails();
mainActivity.sortEmails(emailArray);
}
});
}
}
如果您仍想通過設置活動刷新回收站視圖,請使用此庫。
https://github.com/greenrobot/EventBus
實施鏈接
https://stackoverflow.com/a/40987755/6452937
您無法在您提到的活動之間進行交流。
從您的MainActivity
使用startActivityForResult()
方法調用Settings
例如:
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
}
}
}
另一種方式
如果您不想在單擊resetbutton
按鈕后終止setting activity
,則可以使用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);
}
});
在onStart()
中的main activity
中
@Override
protected void onStart(){
super.onStart();
if(SharedPrefManager.getInstance(context).isSortedByEmail()){
// here you can sorting your recyclerview
sortEmails(getEmails());
}
}
您在設置中初始化了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()
}
...
}
當 SharedPreference 中的值為 true 時,在MainActivity
中覆蓋onResume()
並更新列表,
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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.