java - 如何使用 RecyclerView 的 TextView 中的值从房间数据库中为 TextView 设置新值
问题描述
我不确定标题有多清晰,但基本上该应用程序有一个从房间数据库填充的 RecyclerView。我有两个房间数据库,一个用于保存有关标记的信息,一个用于保存另一个数据库的标记 ID 的参考号和其他一些信息。
现在 RecyclerView 填充了来自数据库的信息,该数据库包含对标记 ID 的引用。我想从 TextView 中获取引用的 ID,并将 Text 设置为来自包含标记的数据库中的相应标记信息。
首先是适配器,我在其中绑定了视图并为每个视图设置了值。使用 setJourneyObjectList() 方法将信息从持有 RecyclerView 的 Fragment 传递给 RecyclerView。
public class JourneyAdapter extends RecyclerView.Adapter<JourneyAdapter.JourneyViewHolder> {
private List<JourneyObject> journeyObjectList = new ArrayList<>();
...
@Override
public void onBindViewHolder(@NonNull JourneyAdapter.JourneyViewHolder holder, int position) {
JourneyObject journeyObject = journeyObjectList.get(position);
holder.titleTextView.setText(journeyObject.getTitle());
holder.descriptionTextView.setText(journeyObject.getDescription());
holder.countyTextView.setText(journeyObject.getCounty());
holder.location1.setText(Integer.toString(journeyObject.getLocation1()));
holder.location2.setText(Integer.toString(journeyObject.getLocation2()));
public void setJourneyObjectList(List<JourneyObject> journeyObjectList){
this.journeyObjectList = journeyObjectList;
notifyDataSetChanged()
class JourneyViewHolder extends RecyclerView.ViewHolder{
TextView location1, location2, location3, location4, location5;
public JourneyViewHolder(final View itemView){
super(itemView);
titleTextView = itemView.findViewById(R.id.journeyTitleText);
countyTextView = itemView.findViewById(R.id.journeyCountyText);
descriptionTextView = itemView.findViewById(R.id.journeyDescriptionText);
location1 = itemView.findViewById(R.id.journeyloc1);
location2 = itemView.findViewById(R.id.journeyloc2);
});
}
}
这是带有 RecyclerView 的片段,我从中设置了 RecyclerView 适配器并设置了要从中填充 RecyclerView 的列表。
现在在这个片段的末尾,我找到了 RecyclerView 项目内的视图,并尝试将文本设置为具有接收到的 ID 的标记的标题。我知道它不会像这样工作,但这只是为了清楚我想要做什么。
public class TabJourneyFragment extends Fragment {
private MarkerViewModel markerViewModel;
private JourneyViewModel journeyViewModel;
public TabJourneyFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_tab_journey, container, false);
RecyclerView recyclerView = rootView.findViewById(R.id.journeyRecyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
JourneyAdapter journeyAdapter = new JourneyAdapter(requireActivity());
recyclerView.setAdapter(journeyAdapter);
markerViewModel = new ViewModelProvider(this).get(MarkerViewModel.class);
journeyViewModel = new ViewModelProvider(this).get(JourneyViewModel.class);
journeyViewModel.getAllJourneyInfo().observe(getActivity(), new Observer<List<JourneyObject>>() {
@Override
public void onChanged(List<JourneyObject> journeyObjects) {
journeyAdapter.setJourneyObjectList(journeyObjects);
}
});
TextView location1 = rootView.findViewById(R.id.journeyloc1);
markerViewModel.getAllMarkers().observe(getActivity(), new Observer<List<MarkerObject>>() {
@Override
public void onChanged(List<MarkerObject> markerObjects) {
for (MarkerObject markerObject : markerObjects){
if (location1 != null){
if (location1.getText().equals(Integer.toString(markerObject.getId()))){
location1.setText(markerObject.getTitle());
}
}else {
Toast.makeText(getActivity(), "This is empty", Toast.LENGTH_SHORT).show();
}
}
}
});
return rootView;
}
}
我希望有人可以提供帮助,并且我很清楚可以理解。提前致谢!
解决方案
要根据标记 id 更改标题,请将 markerObject、journeyObjects 都发送到您的适配器中。
journeyViewModel.getAllJourneyInfo().observe(getActivity(), new Observer<List<JourneyObject>>() {
@Override
public void onChanged(List<JourneyObject> journeyObjects) {
//add this journyObjects in List
journeyObjectsList.addAll(journeyObjects);
}
});
markerViewModel.getAllMarkers().observe(getActivity(), new Observer<List<MarkerObject>>() {
@Override
public void onChanged(List<MarkerObject> markerObjects) {
//set adapter here for recyclerView
markerObjectsList.addAll(markerObjects);
//change adapter constructor based on this argument
journeyAdapter.setJourneyObjectList(journeyObjectsList,markerObjectList);
}
});
//然后在onBindViewHolder()中为每个文本视图设置标题
@Override
public void onBindViewHolder(@NonNull JourneyAdapter.JourneyViewHolder holder, int position) {
JourneyObject journeyObject = journeyObjectList.get(position);
holder.location1.setText(Integer.toString(journeyObject.getLocation1()));
for (int i=0;i<markerObjectList.size();i++){
if (location1 != null && location1.getText().equals(Integer.toString(markerObjectList.get(i).getId()))){
location1.setText(markerObjectList.get(i).getTitle());
}
}else {
Toast.makeText(getActivity(), "This is empty", Toast.LENGTH_SHORT).show();
}
}
推荐阅读
- reactjs - reactjs中的复选框属性DefaultChecked不适用于单选按钮更新的状态
- ms-access - 在 MS Access 中,当查询结果为空时,是否有一种简单的方法可以显示 0.00 美元的金额?
- mysql - 我可以在 mySQL 查询中将变量值添加到表中吗?
- javascript - Discord Music bot - 我播放的歌曲在结束前 10-20 秒停止,所以我添加了 highWaterMark,现在这首歌几乎没有播放
- python - 为什么一个空的 numpy 数组有一个形状,这是什么意思?
- dom - *DOM* 多个表单应该包含在它们自己的表单元素中
- algorithm - 3个嵌套循环的时间复杂度计算
- typescript - Nuxt.js Typescript - 尝试访问计算属性中的数据对象时出错
- java - 如何通过使用 from 方法传递参数来为属性赋值?
- netlogo - 如何从没有海龟的代理集中选择补丁?