2017-02-11 1 views
0

Gonna tun einige Hintergrund, so dass Sie besser, was ich zu erreichen, Bild.Android Recyclerview, fügen Sie neue Elemente, die den Rest unverändert und das Scrollen an der gleichen Stelle

Nun, die Sache ist, im Lesen von Daten aus einer Datenbank, diese Daten ändern sich relativ schnell, sagen wir alle 30 Sekunden, ich muss den Recycler scrollen, um die neuen Daten zu überprüfen und einige Tasten drücken, jedes Mal, wenn ich die Taste drücke, es ändert seine Farbe, aber 2 Dinge passieren.

1- Ich aktualisiere den Recycler mit einem Timer alle paar Sekunden, wenn ich scrollte und die Aktualisierung kommt, wird es bis zum ersten Element gehen und das kann nicht passieren, also muss ich einen Weg zu verhindern Dies.

2 - alle Daten, die aus der Datenbank kommen, müssen angepasst werden. Dazu drücke ich eine Taste, diese Taste ändert ihre Farbe, wenn ich sie drücke, also weiß ich, dass die Aktion für diese Taste ausgeführt wird Timer aktualisiert den Recycler es geht nicht nur zum ersten Element, sondern auch die Schaltflächen auf die ursprüngliche Farbe, weil erstellt den gesamten Recycler mit den Daten in der Datenbank, und das kann nicht passieren, wenn der Timer den Recycler aktualisiert, der alte Gegenstände sollten gleich bleiben und nur die NEUEN hinzufügen, wenn sie neu sind.

naja heres meinen Code für den Adapter und für die Activity, danke schonmal für die Hilfe.

Hier ist der Adapter

public class ComandaAdapter extends 
    RecyclerView.Adapter<ComandaAdapter.ComandaAdapterViewHolder> 
    implements View.OnClickListener{ 

private ArrayList<Comanda> list_comandas; 
private Context context; 
private View.OnClickListener listener; 


public ComandaAdapter(Context con, ArrayList<Comanda> list) { 
    this.context = con; 
    this.list_comandas = list; 
} 

@Override 
public ComandaAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.row, parent, false); 


    return new ComandaAdapterViewHolder(itemView); 
} 

@Override 
public void onBindViewHolder(ComandaAdapterViewHolder holder, int position) { 

    Integer anchomanda = Math.round(context.getResources().getDimension(R.dimen.parents_size)); 

    // Llenar la información de cada item 

    Comanda comanda = list_comandas.get(position); 

    comanda.setNro_comanda(position+""); 

    String cadena = comanda.getOrden(); 
    Integer tope = cadena.length(); 

    Boolean tijera_categoria=false; 

    Boolean tijera_articulo=true; 
    Boolean tijera_contorno=true; 
    Boolean tijera_cambio =true; 

    Integer indisup; 
    Integer indiin =0; 
    char apuntador; 
    String Buscado =""; 
    String Buscado_contorno=""; 
    String Buscado_categoria=""; 
    Integer id=0; 

     holder.txt_comanda.setText(position+""); 

     holder.txt_mesa.setText(comanda.getMesa()); 

     for (int i = 0; i < tope ; i++) { 

      apuntador = cadena.charAt(i); 

      if (Buscado.equals("Bebidas")){ 
       break; 
      } 
      else 
      { 
       if (apuntador == '$') 
       { 
        break; 
       } 
       else 
       { 
        //CUERPO PRINCIPAL DE EJECUCION 

        if (apuntador == '#' && !tijera_categoria) 
        { 
         if (i==0) { 
          indiin = i + 1; 
         } 

        } 

        if (apuntador == '!' && !tijera_categoria) 
        { 
         tijera_categoria=true; 
         tijera_articulo=false; 
         indisup=i; 

         id=i; 

         Buscado=cadena.substring(indiin,indisup); 
         indiin=indisup+1; 

         Buscado_categoria=Buscado; 

         holder.b[id].setId(id); 

        } 

        if (apuntador == '%' && !tijera_articulo) 
        { 
         indisup=i; 
         tijera_articulo=true; 
         tijera_contorno=false; 

         Buscado=cadena.substring(indiin,indisup); 

         indiin=indisup+1; 

         holder.b[id].setLayoutParams(new LinearLayout.LayoutParams(anchomanda, LinearLayout.LayoutParams.WRAP_CONTENT)); 
         holder.b[id].setTextSize((context.getResources().getDimension(R.dimen.txt_size))/2); 
         if (Buscado_categoria.equals("Fondos")) { 
          holder.b[id].setBackgroundTintList(context.getResources().getColorStateList(R.color.fondos, null)); 
         } 
         if (Buscado_categoria.equals("Entradas")) { 
          holder.b[id].setBackgroundTintList(context.getResources().getColorStateList(R.color.entradas, null)); 
         } 
         if (Buscado_categoria.equals("Postres")) { 
          holder.b[id].setBackgroundTintList(context.getResources().getColorStateList(R.color.postres, null)); 
         } 
         holder.b[id].setText(Buscado); 
         holder.lyocomanda.addView(holder.b[id]); 

        } 

        if (apuntador == '*' && !tijera_contorno) 
        { 
         indisup=i; 
         tijera_cambio=false; 

         Buscado=cadena.substring(indiin,indisup); 
         indiin=indisup+1; 

         if (!Buscado.equals("")) { 
          Buscado_contorno=Buscado; 
          holder.t[i].setText(Buscado); 
          holder.t[i].setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 
          holder.t[i].setTextSize((context.getResources().getDimension(R.dimen.txt_size))/2); 
          holder.l[id].addView(holder.t[i]); 
         } 

        } 

        if (apuntador == '#' && !tijera_cambio) 
        { 
         indisup=i; 
         tijera_contorno=true; 
         tijera_cambio=true; 
         tijera_categoria=false; 

         Buscado=cadena.substring(indiin,indisup); 
         indiin=indisup+1; 

         if (!Buscado_contorno.equals("")) { 
          holder.l[id].setLayoutParams(new LinearLayout.LayoutParams(anchomanda, ViewGroup.LayoutParams.WRAP_CONTENT)); 
          holder.l[id].setOrientation(LinearLayout.VERTICAL); 
          holder.l[id].setBackground(context.getDrawable(customborder)); 
          holder.lyocomanda.addView(holder.l[id]); 
         } 

        } 

        //FIN CUERPO PRINCIPAL DE EJECUCION 

       } //EJECUCION DE DESCARTE DE FINAL DE CADENA 
      } //EJECUCION DE DESCARTE DE BEBIDAS 

     } 

} 

@Override 
public int getItemCount() { 

    return list_comandas.size(); 
} 

public void removeItem(int position) { 
    list_comandas.remove(position); 
    notifyItemRemoved(position); 
} 

@Override 
public void onClick(View view) { 
    if (listener != null) 
    { 
     listener.onClick(view); 
    } 
} 

public void setOnClickListener(View.OnClickListener listener) 
{ 
    this.listener = listener; 
} 

public class ComandaAdapterViewHolder extends RecyclerView.ViewHolder { 

    TextView txt_comanda, txt_mesa; 
    private LinearLayout lyocomanda; 

    private Integer cant_platos =500; 

    private TextView[] t = new TextView[(cant_platos*8)]; 
    private LinearLayout[] l = new LinearLayout[cant_platos]; 
    private Button[] b = new Button[cant_platos]; 

    public ComandaAdapterViewHolder(View itemView) { 
     super(itemView); 

     // Inicializamos los controles 
     lyocomanda = (LinearLayout) itemView.findViewById(R.id.lyocomanda); 

     txt_comanda = (TextView) itemView.findViewById(R.id.txt_comanda); 

     txt_mesa = (TextView) itemView.findViewById(R.id.txt_mesa); 

      for (int i = 0; i <cant_platos; i++) { 

       /////////////////////////////CONFIGURACION DEL BOTON/////////////////////////// 

       b[i] = new Button(itemView.getContext()); 
       b[i].setOnClickListener(listener); 

       ///////////////////////////CONFIGURACION DEL CONTORNO/////////////////////////// 

       l[i] = new LinearLayout(itemView.getContext()); 
       t[i] = new TextView(itemView.getContext()); 

      } 

      } 
     } 

     } 

Heres die Aktivität

public class MainActivity extends AppCompatActivity { 


private ComandaAdapter mComandaAdapter; 
ArrayList<Comanda> lista_Comanda; 
RecyclerView rec_Lista; 

public int counter = 0; 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    rec_Lista = (RecyclerView) findViewById(R.id.rec_lista); 

    new CountDownTimer(10000, 100){ 

     @Override 
     public void onTick(long millisUntilFinished) { 


      counter++; 

     } 

     @Override 
     public void onFinish() { 
      try{ 
       loadRetrofitComanda(); 
       counter = 0; 
       start(); 
      } 
      catch (Exception e){ 
       mostrarMensaje("Error: " + e.getMessage()); 
      } 

     } 
    }.start(); 

} 

@Override 
protected void onResume() { 
    super.onResume(); 

    loadRetrofitComanda(); 

} 


private void loadRetrofitComanda() 
{ 
    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl("http://192.168.0.20:3000") 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 

    IRequestComanda request = retrofit.create(IRequestComanda.class); 

    Call<ArrayList<Comanda>> call = request.getJSONComandas(); 

    call.enqueue(new Callback<ArrayList<Comanda>>() { 
     @Override 
     public void onResponse(Call<ArrayList<Comanda>> call, Response<ArrayList<Comanda>> response) { 

      ArrayList<Comanda> lista = response.body(); 

      lista_Comanda = lista; 

      // Refresh recyclerview 
      setAdapter(); 
      configurarOrientacionLayout(); 
     } 

     @Override 
     public void onFailure(Call<ArrayList<Comanda>> call, Throwable t) { 

      mostrarMensaje("Error: " + t.getMessage()); 
     } 
    }); 
} 




private void mostrarMensaje(String mensaje) 
{ 
    Toast.makeText(getApplicationContext(), mensaje, Toast.LENGTH_SHORT).show(); 
} 


private void setAdapter() 
{ 
    mComandaAdapter = new ComandaAdapter(getApplicationContext(), lista_Comanda); 

    mComandaAdapter.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      mostrarMensaje("ejecutar accion"); 
     } 
    }); 

    rec_Lista.setAdapter(mComandaAdapter); 



} 


private void configurarOrientacionLayout() 
{ 
    rec_Lista.setLayoutManager(new  L LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false)); 
    } 
    } 

Antwort

0

ein kleines Update, ich haben es geschafft, den recyclerview Zustand zu halten, wenn neue Daten mit 2 Zeilen Code kommt:

 recyclerViewState = rec_Lista.getLayoutManager().onSaveInstanceState();//save 
    setAdapter(); 
    configurarOrientacionLayout(); 
    rec_Lista.getLayoutManager().onRestoreInstanceState(recyclerViewState);//restore 

durch Speichern und Wiederherstellen des Layout-Managers vor und nach dem Aufruf der setAdapter-Methode, also 1 mehr Problem zu gehen .. die Scroll-Position für jeden Recycler Artikel.

Das endgültige Problem damit gelöst.

mComandaAdapter.notifyItemInserted(lista_Comanda.size()); 

so prüfe ich, ob neue Objekte angekommen ist, wenn ja, ich das Element nur isolieren und es zu dem Recycler hinzufügen und alles andere bleibt unverändert .. Im den Adapter jedes Mal neue Daten kommen jetzt nicht einstellen.

hoffe das kann jedem helfen.

Verwandte Themen