android - 插入新项目后如何在回收站 View 中不丢失当前数据

标签 android android-recyclerview

当我在 Recycler View 中添加新的数据项(从 Activity 到 Activity)时,当前项丢失了。插入新项目后如何不错过回收站 View 中的当前数据? 谢谢。

更新

这是我的代码:

import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class RecyclerActivity extends AppCompatActivity implements     View.OnClickListener{
    private RecyclerView listRecyclerView;
    private StaggeredGridLayoutManager gaggeredGridLayoutManager;
    private List<GetItemData> getItemDataList = new ArrayList<>();
    private Button btnBack;
    private MyAdapter myAdapter;
    final int[] mfp_photo = {R.drawable.dg, R.drawable.er, R.drawable.ib,
        R.drawable.m, R.drawable.md, R.drawable.mk, R.drawable.r, R.drawable.rf,
        R.drawable.rn, R.drawable.sm};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view);
        listRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        listRecyclerView.setHasFixedSize(true);

        gaggeredGridLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
        listRecyclerView.setLayoutManager(gaggeredGridLayoutManager);
        Bundle bundle = getIntent().getExtras();
        GetItemData getItemData = new GetItemData(bundle.getString("Name"), bundle.getString("Age"), bundle.getString("Date of Birth"),
                bundle.getString("Address"), bundle.getString("Gender"), bundle.getInt("list_length"));
            myAdapter = new MyAdapter(getItemDataList, this);
            myAdapter.addItem(getItemData);

        listRecyclerView.setAdapter(myAdapter);
        btnBack = (Button) findViewById(R.id.buttonBack);
        btnBack.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.buttonBack:
                Intent intent = new Intent(this, new MainActivity().getClass());
                startActivity(intent);
                break;
            default:break;
        }
    }

    class MyViewHolder extends RecyclerView.ViewHolder {
        public ImageView fp_photo;
        public TextView fp_name;
        public MyViewHolder(View itemView) {
            super(itemView);
            fp_name = (TextView) itemView.findViewById(R.id.fp_name);
            fp_photo = (ImageView) itemView.findViewById(R.id.fp_photo);

        }
    }

    class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
        Context context;
        private List<GetItemData> getItemDataList_Adapter;

        public MyAdapter(List<GetItemData> getItemDataList_Adapter, Context context) {
            super();
            this.context = context;
            this.getItemDataList_Adapter = getItemDataList_Adapter;

        }

        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            if (parent.getTag() != null) {
                return (MyViewHolder)(parent.getTag());
            } else {
                View view = LayoutInflater.from(context).inflate(R.layout.cardview, parent, false);
                MyViewHolder viewHolder = new MyViewHolder(view);
                return viewHolder;
            }
        }

        @Override
        public void onBindViewHolder(MyViewHolder holder,int position) {
            Random rand = new Random();
            int _rpositon = rand.nextInt(mfp_photo.length);


            holder.fp_photo.setImageResource(mfp_photo[position]);
            holder.fp_name.setText(getItemDataList_Adapter.get(position).getName());

        }

        @Override
        public int getItemCount() {
            return getItemDataList_Adapter.size();
        }
        public void addItem(GetItemData Data) {
            getItemDataList_Adapter.add(Data);
            notifyDataSetChanged();

        }

    }
}

数据是从 MainActivity 获取到此 Activity 的,但是当我将新项目添加到 RecylerView 时,现有项目丢失了。

最佳答案

我相信您正在寻找制作 List<GetItemData> getItemDataList一个全局变量,这样它的值就可以跨 Activity 使用。在 android 术语中,您正在尝试拥有 getItemDataList 的应用程序上下文。

为此,首先创建一个应用程序类 MyApp.java,

public class MyApp extends Application {

    private ArrayList<ItemData> dataList;

    public ArrayList<ItemData> getDataList() {
        return dataList;
    }

    public void setDataList(ArrayList<ItemData> dataList) {
        this.dataList = dataList;
    }

    public void addData(ItemData data){
        if(dataList == null){
            dataList = new ArrayList<>();
        }

        dataList.add(data);
    }
}

现在,将这个类添加为 android:name对于 list 中的应用程序标签,

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tony.myapp">

    <application
        android:name=".MyApp"
        .....>

在 MainActivity 中:

ItemData itemData = new ItemData("John Doe", "16", 
                                    "15 July 2000",
                                    "Address", "Male", 10);
MyApp myApp = (MyApp) getApplicationContext();
myApp.addData(itemData);

// Logic for going to RecyclerActivity here. 
// No need to pass getItemData as a bundle.  

然后,您需要在 RecyclerActivity 中做的就是,

MyApp myApp = (MyApp) getApplicationContext();
List<ItemData> itemDataList = myApp.getDataList();

myAdapter = new MyAdapter(itemDataList, this);
listRecyclerView.setAdapter(myAdapter);

建议

看起来您的 Java 命名约定搞砸了。例如,类名和变量名应该始终是名词,切勿使用动词。引用Naming Conventions获取更多信息。

关于android - 插入新项目后如何在回收站 View 中不丢失当前数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38380454/

相关文章:

java - 在 Android Jelly Bean 上恢复 RSA 私钥时出错

android - 我没有导入 Recycler View AndroidX 库,但我正在使用它。为什么以及如何运作?

Android Kotlin 对回收站 View 中点击事件的新 Intent

android - 将 Realm 与回收者 View 一起使用的最佳实践?

android - 如何在 Android 模拟器中模拟真实的移动互联网连接

android - Exoplayer2 OutOfMemoryError 异常和应用程序崩溃

android - 网站背景在 Android 上显示不正确。 Chrome DevTools 没有反射(reflect)这一点

android - 'cordova run android' 适用于版本 3.6.4 但不适用于 4.0.0

android - LazyColumnFor 滚动不流畅

java - RecyclerView 单击并替换另一个 Activity 中的图像