Java Android,我可以在使用recyclerview时获取要保存的列表数据吗
我正在尝试使用RecyclerView在.main活动中显示数据列表。当我将ListView与适配器一起使用时,我可以使用单击的位置访问源数据ArrayList,以便将list元素传递给编辑活动。使用RecyclerView,当onListItemClicked试图访问它以获取列表元素并将其添加到Intent时,填充RecyclerView的ArrayList为Null。我假设这是因为处理点击的机制是在MainActivity类之外完成的,与ListView不同,因此一旦创建完成,变量就不再存在,但我不确定 我不想从视图中读取列表数据(是吗?)。除非有办法使此列表持久化,否则我唯一能想到的就是让主活动读取一个文件以构建列表,然后再次读取该文件以使列表元素传递给编辑活动,或者让主活动传递元素位置/索引,并让编辑活动访问列表文件以检索元素。但这两种方法似乎都需要大量的文件访问,需要编辑活动来管理列表和主活动Java Android,我可以在使用recyclerview时获取要保存的列表数据吗,java,android,android-recyclerview,Java,Android,Android Recyclerview,我正在尝试使用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
...
}