Передать несколько параметров в RecyclerView - PullRequest
0 голосов
/ 02 мая 2018

В моем текущем коде я могу передать и отобразить одно значение в RecyclerView. Я не уверен, что мне не хватает или мне нужно полностью изменить свой код.

Вот мой класс адаптера:

public class TechSkillsAdapter extends RecyclerView.Adapter<TrainingViewHolder> {

    Context c;
    ArrayList<String> trainings;

    public TechSkillsAdapter(Context c, ArrayList<String> trainings) {
        this.c = c;
        this.trainings = trainings;
    }

    @Override
    public TrainingViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(c).inflate(R.layout.cv_traininglist, parent, false);
        return new TrainingViewHolder(v);
    }

    @Override
    public void onBindViewHolder(TrainingViewHolder holder, int position) {
        holder.date_txt.setText(trainings.get(position));
    }

    @Override
    public int getItemCount() {
        return trainings.size();
    }

}

Я извлекаю список, используя модификацию, а затем передаю значения методу, который отображает их в обзоре переработчика.

Вот как я получаю тренировки:

private void getTraining(final String id, String tid){
        com.trendmicro.projectlara.apis.ApiServiceTraining apiService = ApiClient.getClient().create(ApiServiceTraining.class);
        Call<List<Training>> call = apiService.getMyTraining(id, tid);
        call.enqueue(new Callback<List<Training>>() {
            @Override
            public void onResponse (Call<List<Training>> call, Response<List<Training>> response) {    
                List<Training> training = response.body();
                for(Training t: training){
                    fillTrainings(t.getTraining_title().toString(), t.getTraining_date().toString());
                }
            }

Вот мой метод fillTrainings.

Я передаю два значения, но могу отображать только одно значение:

private void fillTrainings(String title, String date) {
  training.add(title);

  adapter = new TechSkillsAdapter(getContext(), training);
  rv.setAdapter(adapter);
  progressDialog.dismiss();
}

Вот что я пытаюсь исправить, я не уверен, как отобразить дату, так как способ добавления значений: training.add(title);

current list Любая помощь или совет очень ценится. Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Вы получаете List из Training, но по какой-то причине ваш адаптер поддерживается List из String. Почему это так?

Измените свой адаптер для хранения тренингов, а затем привязайте заголовок и дату к представлению.

public class TechSkillsAdapter extends RecyclerView.Adapter<TrainingViewHolder> {

    Context c;
    ArrayList<Training> trainings;

    public TechSkillsAdapter(Context c, ArrayList<Training> trainings) {
        this.c = c;
        this.trainings = trainings;
    }

    @Override
    public TrainingViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(c).inflate(R.layout.cv_traininglist, parent, false);
        return new TrainingViewHolder(v);
    }

    @Override
    public void onBindViewHolder(TrainingViewHolder holder, int position) {
        holder.title_txt.setText(trainings.get(position).getTraining_title().toString());
        holder.date_txt.setText(trainings.get(position).getTraining_date().toString());
    }

    @Override
    public int getItemCount() {
        return trainings.size();
    }

}

А потом в вашем onResponse просто сделайте:

    @Override
    public void onResponse (Call<List<Training>> call, Response<List<Training>> response) {    
        List<Training> training = response.body();
        adapter = new TechSkillsAdapter(getContext(), training);
        rv.setAdapter(adapter);
        progressDialog.dismiss();
    }

Это должно работать, но вы можете улучшить это, если один раз создадите и настроите свой адаптер (в onCreate) и передадите ему некоторый список, а затем в onResponse просто обновите этот список и выполните adapter.notifyDataSetChanged() В некотором роде так:

//Activity
   List<Training> mTrainingsList = new ArrayList<Training>();

//onCreate
adapter = new TechSkillsAdapter(getContext(), mTrainingsList);
...
}



@Override
public void onResponse (Call<List<Training>> call, Response<List<Training>> response) {    
    List<Training> training = response.body();
    mTrainingList.clear();
    mTrainingList.addAll(training);
    adapter.notifyDatasetChanged();
    progressDialog.dismiss();
}

РЕДАКТИРОВАТЬ: Также обратите внимание, что в вашем коде вы просматриваете список тренировок и воссоздаете адаптер для каждого элемента ! Постарайтесь избежать этого в будущем.

0 голосов
/ 02 мая 2018

Это потому, что вы воссоздаете адаптер каждый раз, когда у вас есть элемент с этим кодом:

@Override
public void onResponse (Call<List<Training>> call, Response<List<Training>> response) {    
    List<Training> training = response.body();
    for(Training t: training){
        // here you're only send one time
        fillTrainings(t.getTraining_title().toString(), t.getTraining_date().toString());
    }
}

Вы можете исправить это, отправив весь список вашему методу, изменив метод на этот:

private void fillTrainings(List<Training> trainList) {
  for(Training train: trainList) {
    training.add(train.getTraining_title().toString());
  }

  adapter = new TechSkillsAdapter(getContext(), training);
  rv.setAdapter(adapter);
  progressDialog.dismiss();
}

тогда вы можете использовать его с:

@Override
public void onResponse (Call<List<Training>> call, Response<List<Training>> response) {    
  List<Training> training = response.body();
  fillTrainings(training);
}
...