Listview mit Checkbox status nicht durch klicken setz

  • Antworten:9
Steve bennet
  • Forum-Beiträge: 14

23.02.2016, 17:38:02 via Website

Hallo,

bin leider kein Androidexperte und hab eine Frage zu Listview mit Checkboxen.

Ich benutze ein Listview mit Checkboxen, welches ich im Internet gefunden habe. Es funktioniert soweit, beim Klicken werden die Checkboxen geändert. Jetzt läuft das alles über die Onclick-Funktionen im Adapter.

Wie kann ich jetzt codemäßig die Checkboxen ändern? Also, wie kann ich z.B mit einem Button die ersten Checkboxen auf "check" oder "uncheck" ändern?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

23.02.2016, 17:44:29 via Website

Hallo Steve,
wenn du eine Standartisierte CheckBoxListView verwendest, dann kannst du die DefaultWerte über die listView setzen:

listView.setItemChecked(i, true);

i: ist hierbei die ListView Poision an welcher sich das item befindet

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Steve bennet
  • Forum-Beiträge: 14

24.02.2016, 23:19:14 via Website

Hallo Pascal,
danke für die Antwort!
Ich denke, ich habe einen Custom Adapter und mit deinem Vorschlag gehts wohl so nicht. Ich hab noch nicht den Überblick, denn ich glaubte wenn wenn man Text und Buttons o. ä . mischt braucht man einen Custom Adapter.
Jetzt muss ich erst mal schaun was so eine Checkboxlistview ist bzw. wo ich die finde. Es sei denn du hast grade mal einen Link parat ;)

Antworten
Steve bennet
  • Forum-Beiträge: 14

28.02.2016, 22:06:15 via Website

Hey Pascal,

vielen Dank für den Link, der war sehr hilfreich.Jetzt klappt das, was ich vorhatte. Besten Dank.

Jetzt häng ich noch an einer Sache die die Listview betrifft. Duch einen Klick auf die Zeile möchte ich deren Text verändern.
Momentan ist es so, ich klicke auf den vorderen Teile der Zeile, dann öffne ich einen Dialog und gebe einen neuen String ein. Wenn ich den Dialog wieder verlasse sollte eigentlich die Eingabe übernommen werden, die wird aber erst in der Listview übernommen wenn ich wieder diesen Eintrag anklicke. Eigentlich mache ich nach der Übergabe eine Adatper.notifyDataSetChanged() aber die Aktualisierung passiert erst später.
Wenn ich den Dialog weglasse und einfach einen festgelegten String übergebe sehe ich den neuen Eintrag sofort.
Hast du da vielleicht auch noch einen Tipp für mich? Gibts ne einfacherer Lösung um einen String einzugen ContextMenu etc. ?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

29.02.2016, 00:42:57 via App

Zeig mal deinen Code eigentlich müsste es auch so gehen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Steve bennet
  • Forum-Beiträge: 14

29.02.2016, 21:31:03 via Website

Ich habe den Programcode von deinem Beispiellink geänder bzw erweitert.

  private void displayListView() {

  //create an ArrayAdaptar from the String Array
    dataAdapter = new MyCustomAdapter(this,
            R.layout.country_info, countryList);
    ListView listView = (ListView) findViewById(R.id.listView1);
    // Assign adapter to ListView
    listView.setAdapter(dataAdapter);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            // When clicked, show a toast with the TextView text
            Country country = (Country) parent.getItemAtPosition(position);
            openDialog();
            dataAdapter.countryList.get(position).setCode(mtxtVersion.getText().toString());
            dataAdapter.countryList.get(position).setName(mtxtVersion.getText().toString());
            dataAdapter.notifyDataSetChanged();

            Toast.makeText(getApplicationContext(), "Clicked on Row: " + country.getName(), Toast.LENGTH_LONG).show();

        }
    });

}

private void openDialog(){
    LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
    View subView = inflater.inflate(R.layout.dialog_layout, null);
    final EditText subEditText = (EditText)subView.findViewById(R.id.dialogEditText);
    final ImageView subImageView = (ImageView)subView.findViewById(R.id.image);
    Drawable drawable = getResources().getDrawable(R.mipmap.ic_launcher);
    subImageView.setImageDrawable(drawable);

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("AlertDialog");
    builder.setMessage("Texteingabe");
    builder.setView(subView);
    AlertDialog alertDialog = builder.create();

    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            mtxtVersion.setText(subEditText.getText().toString());
        }
    });

    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(MainActivity.this, "Cancel", Toast.LENGTH_LONG).show();
        }
    });

    builder.show();
}

mtxtVersion ist ein Textfeld was ich zum Testen benutze.
Wenn ich statt openDialog () z.B.:
dataAdapter.countryList.get(position).setName("mein Eintrag");
dataAdapter.notifyDataSetChanged();
benutze funktioniert es direkt.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

29.02.2016, 21:41:29 via App

Du hast vergessen das listView Notify im ok listener des Dialogs zu setzen.
Du machst da zwar was, es hat aber keine auswirkung auf die ListView da du nicht mal werte in der ArrayLost oder im Adapter änderst

— geändert am 29.02.2016, 21:42:24

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Steve bennet
  • Forum-Beiträge: 14

29.02.2016, 23:41:24 via Website

Aber ich benutzte doch den Adapter um die Countrylist zu ändern.

Wenn ich z.B. folgendes benutze ( nach opendialog oder wenn ich opendialog weglasse):
dataAdapter.countryList.get(position).setName("mein Eintrag");
dataAdapter.notifyDataSetChanged();

zeigt mir der Listview das Richtige an. Ist dann die Countrylist nicht wirklich aktualisiert?

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

01.03.2016, 00:20:25 via App

Ah jetzt versteh ich dein Problem
Du drnkst dass wenn du nach den öffnen des Dialogs die liste aktualisiert müssten die geänderten Werte drin stehen.
Aber so ist es nicht
Öffnen ist nur öffnen dann geht es in der Methode weiter.
Das aktualisieren musst du dann im ok click listener machen der wird ausgefürt sobald du den Dialog bestàtigst
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mtxtVersion.setText(subEditText.getText().toString());
}

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten