如何使用RecyclerView在不同的图表中显示不同的值?

时间:2018-10-24 19:55:31

标签: javascript android charts android-recyclerview recycler-adapter

因此,我尝试使用ReciclerView显示2个以上使用不同数据的图表。我已经尝试过服务器工作环境,并将代码放置在代码的许多部分,但我无法使其正常工作。

我想我的适配器有问题,或者我以错误的方式调用数据,或者我缺少某种“ For”循环来遍历每个图表的数据,您能给我一些建议吗?

我正在将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));

}

具有getter和setter的构造器

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开始填充第二个图形,这里 *在主要班级

 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

即使我只加载一张图表,它也会以增量方式显示数据,这意味着每个图表都将每个值相加。像这样

Incremental values in charts(抱歉,我无法直接上传图片)

但是,如果我在此处手动设置数据

 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方法中,而不是在代码顶部

  • 在ViewBoldViewHolder中插入的ViewHolder中调用方法

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

它显示图表,但每个图表中仅包含相同的数据

Same data in every chart

这不是我想要的,我希望显示具有自己值的图表

任何帮助将不胜感激 谢谢

0 个答案:

没有答案