如何使用 RecyclerView 的 TextView 中的值从 Room 数据库为 TextView 设置新值

How to use a value inside a RecyclerView's TextView to set new value to the TextView from a Room Database

我不确定标题是否清晰,但基本上应用程序有一个从 Room 数据库填充的 RecyclerView。我有两个房间数据库,一个用于保存有关标记的信息,一个用于保存另一个数据库的标记 ID 的参考编号和其他一些信息。

现在 RecyclerView 填充了来自数据库的信息,该数据库包含对标记 ID 的引用。我想从 TextView 中获取引用的 ID,并将文本设置为来自包含标记的数据库中相应标记的信息。

首先是适配器,我在其中绑定了视图并为每个视图设置了值。使用 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、journeyObject 都发送到您的适配器中。

 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()中为每个文本视图设置Title

 @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();
                }
            }