Hallo zusammen,
ich habe eine (Custom) ListView mit mehreren TextViews und der Möglichkeit die Zeile farblich zu markieren. Habe es über ein über die ganze Zeile gelegtes TextView mit "alpha =0.5" gelöst.
Die ListView wird über einen Adapter gefüttert und ich komme beim Klick auf die einzelnen Werte. Klappt alles wunderbar.
Nun habe ich das Problem, dass wenn die ListView so viele Zeilen hat, dass es zu große fürs Display wird und Scrollbalken auftauchen. Was kein Problem ist.
Wenn ich aber die einzelnen Werte in den Zeilen aktualisieren will, ändere ich im besagten Adapter die Werte mit xZelle_1.set(Pos,"neuer Wert");
Die Werte werden dann im Speicher übernommen. Damit die ListView das übernimmt, setze ich den Adapter neu. Dadurch werden zwar die ganzen Werte aktualisiert, die Liste springt aber auf den Anfang zurück. Daran scheitere ich. Ich hätte es gerne so, dass wenn man z.B. runter scrollt und dort ein Wert ändert, dass die Zahl live geändert wird, ohne dass die Liste gelöscht und direkt neu aufgebaut wird.
Im Netz hatte ich schon gefunden, dass man bei der ListView ein ".notify();" auslöst.
Wenn ich das tue, schmiert die App mit der Fehlermeldung "object not locked by thread before notify()" ab :-(
Frage: hat jemmand ne Idee, wie man die Liste aktualisiert, ohne die Liste neu zu laden?
Danke
Hier mein Code:
ich habe eine (Custom) ListView mit mehreren TextViews und der Möglichkeit die Zeile farblich zu markieren. Habe es über ein über die ganze Zeile gelegtes TextView mit "alpha =0.5" gelöst.
Die ListView wird über einen Adapter gefüttert und ich komme beim Klick auf die einzelnen Werte. Klappt alles wunderbar.
Nun habe ich das Problem, dass wenn die ListView so viele Zeilen hat, dass es zu große fürs Display wird und Scrollbalken auftauchen. Was kein Problem ist.
Wenn ich aber die einzelnen Werte in den Zeilen aktualisieren will, ändere ich im besagten Adapter die Werte mit xZelle_1.set(Pos,"neuer Wert");
Die Werte werden dann im Speicher übernommen. Damit die ListView das übernimmt, setze ich den Adapter neu. Dadurch werden zwar die ganzen Werte aktualisiert, die Liste springt aber auf den Anfang zurück. Daran scheitere ich. Ich hätte es gerne so, dass wenn man z.B. runter scrollt und dort ein Wert ändert, dass die Zahl live geändert wird, ohne dass die Liste gelöscht und direkt neu aufgebaut wird.
Im Netz hatte ich schon gefunden, dass man bei der ListView ein ".notify();" auslöst.
Wenn ich das tue, schmiert die App mit der Fehlermeldung "object not locked by thread before notify()" ab :-(
Frage: hat jemmand ne Idee, wie man die Liste aktualisiert, ohne die Liste neu zu laden?
Danke
Hier mein Code:
Java:
public class MainActivity extends AppCompatActivity {
Button cmdListe;
ArrayList<String> xZelle_1 = new ArrayList<>();
ArrayList<String> xZelle_2 = new ArrayList<>();
ArrayList<String> xZelle_3 = new ArrayList<>();
ArrayList<String> xZelle_4 = new ArrayList<>();
ArrayList<String> xZelle_5 = new ArrayList<>();
ArrayList<Integer> xFarbe = new ArrayList<Integer>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cmdListe=findViewById(R.id.buttonListe);
ListView FarbListe = findViewById(R.id.lstDetailListe);
myListViewAdapter AdapterListe = new myListViewAdapter(FarbListe.getContext(),xZelle_1,xZelle_2,xZelle_3,xZelle_4,xZelle_5,xFarbe);
AddTextToList("1.12345","11","21","01.02.03.04.05","Welle XYZ 1",getResources().getColor(R.color.Schriftfarbe_gruen));
AddTextToList("2.12345","12","12","02.02.03.04.05","Welle XYZ 2",getResources().getColor(R.color.Schriftfarbe_markiert));
AddTextToList("3.12345","1","2","01.02.03.04.05","Welle XYZ 3",getResources().getColor(R.color.Schriftfarbe_warnung));
AddTextToList("3.12345","1","2","01.02.03.04.05","Welle XYZ 3",getResources().getColor(R.color.Schriftfarbe_warnung));
//Klick auf DetailListe
FarbListe.setOnItemClickListener((parent, view, position, id) -> {
String tmpZeile1; tmpZeile1=xZelle_1.get(position);
System.out.println("tmpZelle_1: " + tmpZeile1);
ChangeTextAtList(position,xZelle_1.get(position),xZelle_2.get(position),xZelle_3.get(position),xZelle_4.get(position),xZelle_5.get(position),getResources().getColor(R.color.Schriftfarbe_markiert));
});
}
//Text in die ListView eintragen
void AddTextToList(String Zelle_1, String Zelle_2, String Zelle_3, String Zelle_4, String Zelle_5, Integer ZellenFarbe){
//Farbwert als getResources().getColor(R.color.Schriftfarbe_gruen) eingeben
xZelle_1.add(Zelle_1); xZelle_2.add(Zelle_2); xZelle_3.add(Zelle_3); xZelle_4.add(Zelle_4); xZelle_5.add(Zelle_5); xFarbe.add(ZellenFarbe);
ListView FarbListe = findViewById(R.id.lstDetailListe);
myListViewAdapter AdapterListe = new myListViewAdapter(FarbListe.getContext(),xZelle_1,xZelle_2,xZelle_3,xZelle_4,xZelle_5,xFarbe);
FarbListe.setAdapter(AdapterListe);
}
//Text in der ListView ändern
void ChangeTextAtList(Integer Pos, String Zelle_1, String Zelle_2, String Zelle_3, String Zelle_4, String Zelle_5, Integer ZellenFarbe){
//Farbwert als getResources().getColor(R.color.Schriftfarbe_gruen) eingeben
xZelle_1.set(Pos,Zelle_1); xZelle_2.set(Pos,Zelle_2);xZelle_3.set(Pos,Zelle_3);xZelle_4.set(Pos,Zelle_4);xZelle_5.set(Pos,Zelle_5); xFarbe.set(Pos,ZellenFarbe);
ListView FarbListe = findViewById(R.id.lstDetailListe);
FarbListe.notify(); // <--- HIER PASSIERT DER FEHLER
// das hier funktioniert, lässt die Liste aber auf den Anfang springen
myListViewAdapter AdapterListe = new myListViewAdapter(FarbListe.getContext(),xZelle_1,xZelle_2,xZelle_3,xZelle_4,xZelle_5,xFarbe);
FarbListe.setAdapter(AdapterListe); //DAS WILL ICH VERMEIDEN
}
class myListViewAdapter extends ArrayAdapter<String> {
Context context; String[] rZelle_1; String[] rZelle_2; String[] rZelle_3; String[] rZelle_4; String[] rZelle_5; Integer[] rColor;
myListViewAdapter (Context c, ArrayList<String> Zelle_1, ArrayList<String> Zelle_2, ArrayList<String> Zelle_3, ArrayList<String> Zelle_4, ArrayList<String> Zelle_5, ArrayList<Integer> FarbWert) {
super(c, R.layout.farbliste, R.id.txtZelle_1, Zelle_2);
this.context = c;
this.rZelle_1 = Zelle_1.toArray(new String[0]);
this.rZelle_2 = Zelle_2.toArray(new String[0]);
this.rZelle_3 = Zelle_3.toArray(new String[0]);
this.rZelle_4 = Zelle_4.toArray(new String[0]);
this.rZelle_5 = Zelle_5.toArray(new String[0]);
this.rColor = FarbWert.toArray(new Integer[0]);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater layoutInflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row = layoutInflater.inflate(R.layout.farbliste, parent, false);
TextView Zelle_1 = row.findViewById(R.id.txtZelle_1);
TextView Zelle_2 = row.findViewById(R.id.txtZelle_2);
TextView Zelle_3 = row.findViewById(R.id.txtZelle_3);
TextView Zelle_4 = row.findViewById(R.id.txtZelle_4);
TextView Zelle_5 = row.findViewById(R.id.txtZelle_5);
TextView FarbZeile = row.findViewById(R.id.Hintergrundfarbe);
Zelle_1.setText(rZelle_1[position]);
Zelle_2.setText(rZelle_2[position]);
Zelle_3.setText(rZelle_3[position]);
Zelle_4.setText(rZelle_4[position]);
Zelle_5.setText(rZelle_5[position]);
FarbZeile.setBackgroundColor(rColor[position]);
return row;
}
}
Zuletzt bearbeitet: