Я изучал структуру mvvm и создал приложение, использующее структуру mvvm. Я также использовал комнату и RxJava.
Код
public class ScoresActivity extends AppCompatActivity {
RecyclerView recyclerView;
List<ScoreDataViewModel> scoreDataViewModelList;
ScoreAdapter scoreAdapter;
ScoreViewModel scoreViewModel;
private final CompositeDisposable mDisposable = new CompositeDisposable();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scores);
init();
}
private void init() {
recyclerView=(RecyclerView)findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
scoreDataViewModelList=new ArrayList<>();
scoreAdapter=new ScoreAdapter(scoreDataViewModelList);
recyclerView.setAdapter(scoreAdapter);
ScoreViewModelFactory scoreViewModelFactory = Injection.provideScoreViewModelFactory(this);
scoreViewModel= ViewModelProviders.of(this,scoreViewModelFactory).get(ScoreViewModel.class);
}
@Override
protected void onStart() {
super.onStart();
mDisposable.add(scoreViewModel.getScoreDataViewModels()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<List<ScoreDataViewModel>>() {
@Override
public void accept(List<ScoreDataViewModel> scoreDataViewModels) throws Exception {
scoreDataViewModelList=scoreDataViewModels;
System.out.println(scoreDataViewModelList.toString());
Log.e("size", String.valueOf(scoreDataViewModelList));
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.e("Unable to update list", throwable.toString());
}
}));
}
}
Здесь я вижу правильный размер, напечатанный в журнале. Но я не вижу здесь предметов.
Оценка активности
<?xml version = "1.0" encoding = "utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
xmlns:tools = "http://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
tools:context = "com.sevenbits.android.mvvmsample.view.ScoresActivity">
<android.support.v7.widget.RecyclerView
android:id = "@+id/recyclerView"
android:layout_width = "0dp"
android:layout_height = "0dp"
app:layout_constraintBottom_toBottomOf = "parent"
app:layout_constraintTop_toTopOf = "parent"
app:layout_constraintRight_toRightOf = "parent"
app:layout_constraintLeft_toLeftOf = "parent">
</android.support.v7.widget.RecyclerView>
</android.support.constraint.ConstraintLayout>
Теперь, ScoreViewModel
public class ScoreViewModel extends ViewModel {
private UserDataSource userDataSource;
List<ScoreDataViewModel> scoreDataViewModelList;
public ScoreViewModel(UserDataSource userDataSource) {
this.userDataSource = userDataSource;
}
public Flowable<List<ScoreDataViewModel>> getScoreDataViewModels() {
return userDataSource.getUsers().map(new Function<List<User>, List<ScoreDataViewModel>>() {
@Override
public List<ScoreDataViewModel> apply(List<User> users) throws Exception {
List<ScoreDataViewModel> scoreDataViewModels = new ArrayList<ScoreDataViewModel>();
for (User user : users) {
scoreDataViewModels.add(new ScoreDataViewModel(user));
}
return scoreDataViewModels;
}
});
}
}
И ScoreAdapter
public class ScoreAdapter extends RecyclerView.Adapter<ScoreViewHolder> {
public List<ScoreDataViewModel> scores;
public ScoreAdapter(List<ScoreDataViewModel> scores) {
this.scores = scores;
}
@Override
public ScoreViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
ItemScoreBinding itemScoreBinding = ItemScoreBinding.inflate(layoutInflater, parent, false);
return new ScoreViewHolder(itemScoreBinding);
}
@Override
public void onBindViewHolder(ScoreViewHolder holder, int position) {
ScoreDataViewModel scoreDataViewModel = scores.get(position);
holder.bind(scoreDataViewModel);
}
@Override
public int getItemCount() {
return scores.size();
}
}
ViewHolder
public class ScoreViewHolder extends RecyclerView.ViewHolder {
ItemScoreBinding itemScoreBinding;
ScoreViewHolder(ItemScoreBinding itemScoreBinding) {
super(itemScoreBinding.getRoot());
this.itemScoreBinding=itemScoreBinding;
}
void bind(ScoreDataViewModel scoreDataViewModel) {
itemScoreBinding.setScoreViewModel(scoreDataViewModel);
}
}
Теперь у меня вопрос: почему я не вижу элементы recyclerview. Когда я устанавливал данные без использования места (без извлечения данных из базы данных, вместо этого статически создавал и добавлял объект ScoreDataViewModel), он работал отлично. Где я ошибся? Или то, как я это делаю, неправильно? пожалуйста, помогите мне, так как я совершенно новичок в room, rxjava и mvvm.
Я также могу отредактировать вопрос и добавить дополнительную информацию, если вы спросите. Помогите, пожалуйста.
Примечание: метод scoreAdapter.notifyDataSetChanged() не работает.
Позвоните в scoreAdapter.notifyDataSetChanged() после добавления элементов в список.
public class ScoreAdapter extends RecyclerView.Adapter<ScoreViewHolder> {
public List<ScoreDataViewModel> scores;
public ScoreAdapter(List<ScoreDataViewModel> scores) {
this.scores = scores;
}
//list Update
public void setDataChange(List<ScoreDataViewModel> asList) {
this.scores= asList;
//now, tell the adapter about the update
notifyDataSetChanged();
}
@Override
public ScoreViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
ItemScoreBinding itemScoreBinding = ItemScoreBinding.inflate(layoutInflater, parent, false);
return new ScoreViewHolder(itemScoreBinding);
}
@Override
public void onBindViewHolder(ScoreViewHolder holder, int position) {
ScoreDataViewModel scoreDataViewModel = scores.get(position);
holder.bind(scoreDataViewModel);
}
@Override
public int getItemCount() {
return scores.size();
}
}
тоже поменять на onStart()
mDisposable.add(scoreViewModel.getScoreDataViewModels()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<List<ScoreDataViewModel>>() {
@Override
public void accept(List<ScoreDataViewModel> scoreDataViewModels) throws Exception {
scoreDataViewModelList=scoreDataViewModels;
scoreAdapter.setDataChange(scoreDataViewModelList);
System.out.println(scoreDataViewModelList.toString());
Log.e("size", String.valueOf(scoreDataViewModelList));
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.e("Unable to update list", throwable.toString());
}
}));
}
Это не помогло.
Еще одна вещь, которую я хотел спросить, правильный подход к mvvm + room + RxJava? Или мне нужно что-то изменить?
@rupinderjeet спасибо.
scoreAdapter.notifyDataSetChanged (); в onStart ()