Java Android,我可以在使用recyclerview时获取要保存的列表数据吗

Java Android,我可以在使用recyclerview时获取要保存的列表数据吗,java,android,android-recyclerview,Java,Android,Android Recyclerview,我正在尝试使用RecyclerView在.main活动中显示数据列表。当我将ListView与适配器一起使用时,我可以使用单击的位置访问源数据ArrayList,以便将list元素传递给编辑活动。使用RecyclerView,当onListItemClicked试图访问它以获取列表元素并将其添加到Intent时,填充RecyclerView的ArrayList为Null。我假设这是因为处理点击的机制是在MainActivity类之外完成的,与ListView不同,因此一旦创建完成,变量就不再存在

我正在尝试使用RecyclerView在.main活动中显示数据列表。当我将ListView与适配器一起使用时,我可以使用单击的位置访问源数据ArrayList,以便将list元素传递给编辑活动。使用RecyclerView,当onListItemClicked试图访问它以获取列表元素并将其添加到Intent时,填充RecyclerView的ArrayList为Null。我假设这是因为处理点击的机制是在MainActivity类之外完成的,与ListView不同,因此一旦创建完成,变量就不再存在,但我不确定

我不想从视图中读取列表数据(是吗?)。除非有办法使此列表持久化,否则我唯一能想到的就是让主活动读取一个文件以构建列表,然后再次读取该文件以使列表元素传递给编辑活动,或者让主活动传递元素位置/索引,并让编辑活动访问列表文件以检索元素。但这两种方法似乎都需要大量的文件访问,需要编辑活动来管理列表和主活动

public class MainActivity extends AppCompatActivity
        implements PlanAdapter.ListItemClickListener
{
    // View elements
    private RecyclerView planDisplay;

    // Adapter for building the RecyclerView
    private PlanAdapter mListAdapter;

    // Layout manager for the RecyclerView
    RecyclerView.LayoutManager layoutManager;

    // Plan list
    private static ArrayList<PlanElement> thisPlan;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        planDisplay = findViewById(R.id.rv_plan_display);

        ArrayList<PlanElement> thisPlan = buildThisPlan();

        layoutManager =
                new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        planDisplay.setLayoutManager(layoutManager);
        planDisplay.setHasFixedSize(true);

        mListAdapter = new PlanAdapter(thisPlan, this);
        planDisplay.setAdapter(mListAdapter);

    }

    @Override
    public void onListItemClick(int clickedItemIndex)
    {
        Intent i = new Intent(MainActivity.this, EditPlanItemActivity.class);

        i.putExtra("elementNumber", clickedItemIndex + 1);

// Where the error occurs
        i.putExtra("PlanElement", thisPlan.get(clickedItemIndex));

        startActivity(i);
    }

}

public类MainActivity扩展了AppCompatActivity
实现PlanAdapter.ListItemClickListener
{
//视图元素
私人回收站平面图展示;
//用于构建RecyclerView的适配器
专用平面适配器;
//RecyclerView的布局管理器
RecyclerView.LayoutManager LayoutManager;
//计划清单
私有静态数组列表thisPlan;
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
平面显示=findViewById(R.id.rv\U平面显示);
ArrayList thisPlan=buildThisPlan();
布局经理=
新建LinearLayoutManager(此,LinearLayoutManager.VERTICAL,false);
planDisplay.setLayoutManager(layoutManager);
planDisplay.setHasFixedSize(真);
mListAdapter=新的平面适配器(thisPlan,this);
planDisplay.setAdapter(mListAdapter);
}
@凌驾
仅限公共无效项单击(int-clickedItemIndex)
{
意图i=新意图(MainActivity.this、EditPlanItemActivity.class);
i、 putExtra(“元素编号”,单击编辑索引+1);
//错误发生的位置
i、 putExtra(“PlanElement”,thisPlan.get(单击编辑索引));
星触觉(i);
}
}
公共类PlanAdapter扩展了RecyclerView.Adapter { private ArrayList This Plan; 最终私有列表项ClickListener mOnClickListener; //单击侦听器界面 公共接口ListItemClickListener { 仅作废istitemClick(int-clickedItemIndex); } 公共计划适配器(ArrayList aPlan、ListItemClickListener侦听器) { 该计划=aPlan; mOnClickListener=listener; } @非空 @凌驾 public PlanAdapter.AdapterViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType) { Context=parent.getContext(); int layoutListItem=R.layout.list\u元素; LayoutFlater充气机=LayoutFlater.from(上下文); 视图=充气机。充气(layoutListItem,父项,false); 返回新的AdapterViewHolder(视图); } @凌驾 BindViewHolder上的公共无效(@NonNull AdapterViewHolder,int位置) { PlaneElement thisElement=thisPlan.get(位置); holder.textItem1Display.setText(String.format(“%d”,thisElement.getItem1()); holder.textItem2Display.setText(String.format(“%d”,thisElement.getItem2()); } @凌驾 public int getItemCount() { 返回thisPlan.size(); } 公共类AdapterViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener { 公共文本查看文本项1显示; 公共文本视图文本项2显示; 公共AdapterViewWolder(@NonNull View itemView) { 超级(项目视图); textItem1Display=itemView.findViewById(R.id.textItem1); textItem2Display=itemView.findViewById(R.id.textItem2); setOnClickListener(这个); } @凌驾 公共void onClick(视图) { int clickedPosition=getAdapterPosition(); mOnClickListener.onListItemClick(clickedPosition); } } }
好的,添加了我的适配器。但适配器工作正常。当onClick方法尝试访问空ArrayList时会出现问题。

看起来您在MainActivity中实例化了一个新的
thisPlan
列表。在
OnCreate
方法中,不要创建新的ArrayList,而是使用已经创建的ArrayList。

与此相反:

protected void onCreate(Bundle savedInstanceState)
    {
        ...
        ArrayList<PlanElement> thisPlan = buildThisPlan(); //created a new instace
        ...
    }

你能把适配器的代码贴出来吗?嗯,是的,就是这样。通过在onCreate中实例化新计划,永远不会创建全局计划。非常感谢。
protected void onCreate(Bundle savedInstanceState)
    {
        ...
        ArrayList<PlanElement> thisPlan = buildThisPlan(); //created a new instace
        ...
    }
protected void onCreate(Bundle savedInstanceState)
    {
        ...
        thisPlan = buildThisPlan(); // use the one you already created
        ...
    }