首页 > 解决方案 > 如何使用 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;
    }
}

我希望有人可以提供帮助,并且我很清楚可以理解。提前致谢!

标签: javaandroidandroid-fragmentsandroid-recyclerviewandroid-room

解决方案


要根据标记 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();
                }
            }

推荐阅读