Нет данных, отображаемых в recyclerview

Я изучал структуру 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 (); в onStart ()

Naveen Tamrakar 05.04.2018 11:34

Позвоните в scoreAdapter.notifyDataSetChanged() после добавления элементов в список.

ADM 05.04.2018 11:35
1
2
201
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
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());
                }
            }));
}

Это не помогло.

Riddhi 05.04.2018 11:39

Еще одна вещь, которую я хотел спросить, правильный подход к mvvm + room + RxJava? Или мне нужно что-то изменить?

Riddhi 05.04.2018 11:53

@rupinderjeet спасибо.

Riddhi 05.04.2018 12:25

Другие вопросы по теме