首页 > 解决方案 > 视图模型。设置数据

问题描述

我有两个片段。在卡片的第一个列表中。当您单击卡片时,会打开带有完整描述的第二个片段。我放入了安装在适配器中的捆绑标签。在第二个片段中,我得到了它,我需要按标签设置数据。

在 onChanged 方法中,我写的是 model.setVerse ((List ) data); 但什么也没发生。

起初我试图做 tvTitle.setText(data.getTitle) 但也没有发生任何事情。

视图模型

 public class DataViewModel extends AndroidViewModel {

LiveData<Data> currentVerse;

public DataViewModel(@NonNull Application application, final int verseId) {
    super(application);
    int verseId1 = verseId;
    DataRepository repository = new DataRepository(application);
    currentVerse = repository.getById(verseId);

}

public LiveData<Data> getById() {
    return currentVerse;
}
public void setVerse(List<Data> data) {
    this.currentVerse= (LiveData<Data>) data;

}


public static class ModelFactory extends ViewModelProvider.NewInstanceFactory {

    @NonNull
    private final Application application;
    private final int verseId;
    private final DataRepository repository;

    public ModelFactory(@NonNull Application application, int id) {
        super();
        this.application = application;
        this.verseId = id;
        repository = new DataRepository(application);
    }


    @NonNull
    @Override
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        if (modelClass == DataViewModel.class) {
            return (T) new DataViewModel(application, verseId);
        }
        return null;
    }
}

}

分段

 public class DataFragment extends Fragment {
private int verseId;
private static final String KEY_VERSE_ID = "KEY_VERSE_ID";
public TextView tvTitle;

public DataFragment() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootViewRead = inflater.inflate(R.layout.fragment_data, container, 
false);
    Toolbar toolbar = rootViewRead.findViewById(R.id.toolbar);
    AppCompatActivity activity = (AppCompatActivity) getActivity();
    if (activity != null) {
        activity.setSupportActionBar(toolbar);
    }

    setHasOptionsMenu(true);

    tvTitle = (TextView) rootViewRead.findViewById(R.id.text);

    DataViewModel.ModelFactory factory = new DataViewModel.ModelFactory(
            getActivity().getApplication(), 
 getArguments().getInt(KEY_VERSE_ID));

    final DataViewModel model = ViewModelProviders.of(this, factory)
            .get(DataViewModel.class);
    model.getById().observe(this, new Observer<Data>() {
        @Override
        public void onChanged(Data data) {
            model.setVerse((List<Data>) data);


        }
    });

    return rootViewRead;
}

public static DataFragment forData(int verseId) {
    DataFragment fragment = new DataFragment();
    Bundle args = new Bundle();
    args.putInt(KEY_VERSE_ID, verseId);
    fragment.setArguments(args);
    return fragment;
}

如有必要,我将添加 dao 和存储库类

标签: androidviewmodel

解决方案


以下是您需要修改以设置 LiveData 的值的部分:

LiveData<<List>Data>> currentVerse;

public void setVerse(List<Data> data) {
    this.currentVerse.setValue(data);

}

更多详情请点击这里


推荐阅读