Как использовать RecyclerView для отображения разных значений на разных графиках? - PullRequest
0 голосов
/ 24 октября 2018

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

Я думаю, что это проблема с моим адаптером, или, может быть, я неправильно называю данные или, может быть,Я пропускаю какой-то цикл «Для», чтобы перебрать данные каждой диаграммы, можете ли вы дать мне какой-нибудь совет?

Я использую библиотеку MPAndroidChart для диаграмм, но процесс аналогичен использованию нативнойдиаграмма, я полагаю

Вот мой код:

Основной класс

public class atleta_estadisticas extends Fragment {

public ArrayList<lista_estadisticas> lista_est;
public RecyclerView rcc_lista_estadisticas;
public lista_estadisticas_adaptador adaptador_lista_estadisticas;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_atleta_estadisticas, container, false);

    rcc_lista_estadisticas = (RecyclerView)view.findViewById(R.id.rcc_atletas_estadisticas);
    LinearLayoutManager linear = new LinearLayoutManager(this.getActivity());
    linear.setOrientation(LinearLayoutManager.VERTICAL);
    rcc_lista_estadisticas.setLayoutManager(linear);
    data(); //set all data
    iniciar_adaptador_estadisticas();
    return view;
}

public void data(){
    lista_est = new ArrayList<>();

    //First graphic
    lista_est.add(new lista_estadisticas("R1",0,40));
    lista_est.add(new lista_estadisticas("R2",1,40));
    lista_est.add(new lista_estadisticas("R3",2,30));
    lista_est.add(new lista_estadisticas("R4",3,50));
    lista_est.add(new lista_estadisticas("R5",4,70));
    lista_est.add(new lista_estadisticas("R6",5,30));

    //Second graphic
    lista_est.add(new lista_estadisticas("Q1",0,50));
    lista_est.add(new lista_estadisticas("Q2",1,30));
    lista_est.add(new lista_estadisticas("Q3",2,20));
    lista_est.add(new lista_estadisticas("Q4",3,70));
    lista_est.add(new lista_estadisticas("Q5",4,50));
    lista_est.add(new lista_estadisticas("Q6",5,40));

}

Конструктор с геттером и сеттером

public class lista_estadisticas {

private String competencia_Nombre;
private float competencia_Index;
private float puntuacion;

//Constructor
public lista_estadisticas(String competencia_Nombre, float competencia_Index, float puntuacion) {
    this.competencia_Nombre = competencia_Nombre;
    this.competencia_Index = competencia_Index;
    this.puntuacion = puntuacion;
}

public String getCompetencia_Nombre() {
    return competencia_Nombre;
}
public void setCompetencia_Nombre(String competencia_Nombre) {
    this.competencia_Nombre = competencia_Nombre;
}

public float getCompetencia_Index() {
    return competencia_Index;
}
public void setCompetencia_Index(float competencia_Index) {
    this.competencia_Index = competencia_Index;
}

public float getPuntuacion() {
    return puntuacion;
}
public void setPuntuacion(float puntuacion) {
    this.puntuacion = puntuacion;
} }

Адаптер

public class lista_estadisticas_adaptador extends RecyclerView.Adapter<lista_estadisticas_adaptador.Lista_Estadisticas_ViewHolder>{


private LineChart estadisticas_chart;
ArrayList<Entry> puntuaciones1  = new ArrayList<>();

// Nombre de clase de Java
private ArrayList<lista_estadisticas> estadisticas_lista;
public lista_estadisticas_adaptador(ArrayList<lista_estadisticas> estadisticas_lista ){
    this.estadisticas_lista = estadisticas_lista;
}

@NonNull
@Override
public Lista_Estadisticas_ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.rv_atletas_estadisticas,viewGroup,false);
    return new Lista_Estadisticas_ViewHolder(v);
}

@Override
public void onBindViewHolder(@NonNull Lista_Estadisticas_ViewHolder Lista_Estadisticas_ViewHolder, int i) {
    lista_estadisticas lista = estadisticas_lista.get(i);
    Set_ChartValues(lista);

}

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

public class Lista_Estadisticas_ViewHolder extends RecyclerView.ViewHolder{
    public Lista_Estadisticas_ViewHolder(View itemView){
        super(itemView);



        estadisticas_chart = (LineChart)itemView.findViewById(R.id.chart_atleta_estadisticas);
        TextView tv_rank = (TextView)itemView.findViewById(R.id.tv_Ranking);


        LineDataSet set1 = new LineDataSet(puntuaciones1, "Puntuacion 1");
        List<ILineDataSet> dataSets = new ArrayList<ILineDataSet>();
        dataSets.add(set1);
        LineData data = new LineData(dataSets);
        estadisticas_chart.setData(data);
        estadisticas_chart.invalidate(); // refresh

    }
}

public void Set_ChartValues(lista_estadisticas lst){
    puntuaciones1.add(new Entry(lst.getCompetencia_Index(),lst.getPuntuacion())); //Here's where I set the chart values
}

}

Если я делаю это таким образом, я получаю ошибку java.lang.NegativeArraySizeException: -10

Потому что, когда процесс достигает новых данных диаграммы, он имеет новый индексот 0 до начала заполнения 2-го рисунка, здесь * в основном классе

 lista_est.add(new lista_estadisticas("R6",5,30));

    //Second chart
 lista_est.add(new lista_estadisticas("Q1",0,50)); // New index, because is a new chart

И даже если я загружаю только 1 график, он отображает данные в инкрементном порядке, что означает, что каждый график добавляет другое значение каждыйодин.Вот так

Инкрементальные значения в диаграммах (я не могу напрямую загрузить изображение из-за моего уровня, извините)

Но если я установлю свои данные здесь вручную

 public void Set_ChartValues(){
    puntuaciones1 = new ArrayList<>();
    puntuaciones1.add(new Entry(0,20f));
    puntuaciones1.add(new Entry(1,30f));
    puntuaciones1.add(new Entry(2,50f));
    puntuaciones1.add(new Entry(3,20f));
    puntuaciones1.add(new Entry(4,75f));
    puntuaciones1.add(new Entry(5,43f));
}

И поэтому некоторые корректировки в коде, потому что если нет, я получаю несколько ошибок

  • Установка puntuaciones1 = new ArrayList <> ();вместо этого в методе Set_ChartValues ​​вверху кода

  • Вызов метода в ViewHolder Insted onBindViewHolder

.

 public class Lista_Estadisticas_ViewHolder extends RecyclerView.ViewHolder{
    public Lista_Estadisticas_ViewHolder(View itemView){
        super(itemView);
        Set_ChartValues(); ...

Отображает график, но только с теми же данными на каждом графике

Одинаковые данные на каждом графике

И это не то, что я ищу, я смотрю, чтобы показатьдиаграммы с их собственными значениями

Любая помощь будет признательна Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...