android custom table list mit einer statischen Zeile

  • Antworten:55
  • Bentwortet
AndroidEntwickler
  • Forum-Beiträge: 58

10.03.2016, 10:27:28 via Website

hallo zusammen,

in meiner android app habe ich eine custom table list, in der die Daten dynamisch gefüllt werden.
nur die erste Zeile soll eine statische Zeile werden, welche ich via Programmierung löse.
ich habe diese function um die Daten in die Liste zu füllen.

private void showList() {

        boolean FirstRow = true;

        ArrayList<DatabaseListItems> databaseList = new ArrayList<>();
        databaseList.clear();


        String query = "SELECT * FROM " + DatabaseHelper.DATABASE_TABLE;


        Cursor c1 = dbHandler.selectQuery(query);
            if (c1.moveToFirst()) {
                do {
                    DatabaseListItems databaseListItems = new DatabaseListItems();

                    if (c1.getPosition() == 0 && FirstRow == true) {

                        databaseListItems.setFirstRow(true);

                        FirstRow = false;

                        databaseListItems.setFirstName("FIRST ROW");

                        databaseListItems.setSecondName(null);

                        c1.moveToPosition(-1);

                    } else {
                        databaseListItems.setFirstRow(false);

                        FirstRow = false;

                        databaseListItems.setFirstName(c1.getString(c1.getColumnIndex(DatabaseHelper.COLUMN_FIRSTNAME)));

                        databaseListItems.setSecondName(c1.getString(c1.getColumnIndex(DatabaseHelper.COLUMN_SECONDNAME)));

                        }


                    databaseList.add(databaseListItems);

                } while (c1.moveToNext());
            }
            c1.close();


        DatabaseListAdapter databaseListAdapter = new DatabaseListAdapter(getActivity(), databaseList);
        ListView.setAdapter(databaseListAdapter);


    }

DatabaseListItems

public class DatabaseListItems {

    String firstname;
    String secondname;
    Boolean FirstRow;



    public String getFirstName() {
        return firstname;
    }

    public void setFirstName(String first name) {
        this.firstname= firstname;
    }

    public String getSecondName() {
        return secondname;
    }

    public void setSecondName(String secondname) {
        this.secondname = secondname;
    }



    public Boolean getFirstRow() {
        return FirstRow;
    }

    public void setFirstRow(Boolean FirstRow) {
        this.FirstRow = FirstRow;
    }


}

DatabaseListAdapter

public class DatabaseListAdapter extends BaseAdapter {

    Context context;
    ArrayList<DatabaseListItems> databaseList;
    ArrayList<String> DeleteList = new ArrayList<>();




    public DatabaseListAdapter(Context context, ArrayList<DatabaseListItems> list) {
        this.context = context;
        databaseList = list;
    }


    @Override
    public int getCount() {
        return databaseList.size();
    }

    @Override
    public Object getItem(int position) {
        return databaseList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup arg2) {
        final DatabaseListItems databaseListItems = databaseList.get(position);


        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.custom_listview_item, null);

        }


        TextView tvFirstName = (TextView) convertView.findViewById(R.id.txtViewFirstName);
        tvFirstName.setText(databaseListItems.getFirstName());


        TextView tvSecondName = (TextView) convertView.findViewById(R.id.txtViewSecondName);
        tvSecondName.setText(databaseListItems.getSecondName());

        View row = convertView.findViewById(R.id.row);
        ImageView Arrow = (ImageView) convertView.findViewById(R.id.Arrow);






        // First Static Row
        if (databaseListItems.getFirstRow() == true) {

            tvSecondName.setAlpha(0.0f);
            Arrow.setAlpha(1.0f);

            tvFirstName.setTextColor(Color.parseColor("#161616"));
            row.setBackgroundColor(Color.parseColor("#f7f7f7"));
            row.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    Intent intent=new Intent(context,OtherActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(intent);
                }
            });
        } else {

            tvSecondName.setAlpha(1.0f);
            Arrow.setAlpha(0.0f);


        }

        return convertView;
    }

}

image
Auf den ersten Blick sieht alls gut aus.
Aber wenn ich dann hoch unter runter scrolle, bekommen zufällige Zeilen die background color und die onClick function , welche eigentlich nur die erste statische Zeile haben sollte

image
image

UPDATE
Mir wurde bereits gesagt, dass ich einen ViewHolder bräuchte, um das Problem zu lösen.

Habe damit aber noch nie gearbeitet und das war dann mein erster Versuch:

DatabaseListAdapter mit ViewHolder

public class DatabaseListAdapter extends BaseAdapter {

    Context context;
    ArrayList<DatabaseListItems> databaseList;
    ArrayList<String> DeleteList = new ArrayList<>();

    static class ViewHolder {
        TextView tvFirstName;
        TextView tvSecondName;
        View row;
    }



    public DatabaseListAdapter(Context context, ArrayList<DatabaseListItems> list) {
        this.context = context;
        databaseList = list;
    }


    @Override
    public int getCount() {
        return databaseList.size();
    }

    @Override
    public Object getItem(int position) {
        return databaseList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }



    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final DatabaseListItems databaseListItems = databaseList.get(position);

        View rowView = convertView;

        if (rowView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            rowView = inflater.inflate(R.layout.custom_listview_item, null);

            ViewHolder viewHolder = new ViewHolder();
            viewHolder.tvFirstName = (TextView) rowView.findViewById(R.id.txtViewFirstName);
            viewHolder.tvSecondName = (TextView) rowView.findViewById(R.id.txtViewSecondName);
            viewHolder.row = rowView.findViewById(R.id.row);

            rowView.setTag(viewHolder);
        }



        final ViewHolder holder = (ViewHolder) rowView.getTag();
        holder.tvFirstName.setText(databaseListItems.getFirstName());
        holder.tvSecondName.setText(databaseListItems.getSecondName());




        if (databaseListItems.getFirstRow() == true) {

            holder.tvSecondName.setAlpha(0.0f);
            holder.tvFirstName.setTextColor(Color.parseColor("#161616"));
            holder.row.setBackgroundColor(Color.parseColor("#f7f7f7"));
            holder.row.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    Intent intent=new Intent(context,OtherActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(intent);
                }
            });
        } else {
            holder.tvSecondName.setAlpha(1.0f);
            }
        }

        return rowView;
    }

}

Hat aber leider nichts gebracht :/

— geändert am 10.03.2016, 10:29:36

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

10.03.2016, 14:44:29 via Website

Leider verstehe ich dein Problem nicht, du hast doch eine statische Zeile ( die die im 1. Bild verschommen ist) oder sehe ich das falsch?

Der Code sieht auf den 1. Bilck nicht falsch aus.
Doch wieso machst du es dir so komliziert?
Du kannst doch bevor du die do-while schleife über deine Query machst, das statische Objekt zur liste hinzufügen.
Damit musst du das in der schleife nicht mehr machen ind das Problem ist gelößt

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

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

10.03.2016, 14:46:39 via Website

das Problem ist doch auf Screen 2 und 3 zu erkennen.
es bekommen beim scrollen die zufällig andere Zellen den selben Background-Color wie die erste statische und außerdem bekommen diese auch die onclick Funktion, welche nur die erste statische haben sollte.

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

10.03.2016, 14:53:37 via Website

Ja weil die schelife etwas verwirrend ist.
Am besten du behandelst das statische Elemnt ausßerhalb der schelife, dann hast du das Problem nicht

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

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

10.03.2016, 14:54:48 via Website

okay, und wie füge ich das statische Objekt zur meiner Liste hinzu OHNE die Schleife?

Antworten
Fabian Simon
  • Forum-Beiträge: 359

10.03.2016, 14:56:10 via Website

Hab dein Problem zwar au net ganz verstanden.
Aber schau mal hier :
http://developer.android.com/reference/android/widget/Adapter.html#getView%28int,%20android.view.View,%20android.view.ViewGroup%29

und versuche mal in deiner getView Methode des Adapter die if bedingung anders zu setzten...:

Du willst ja nicht immer die erste angezeige zeile sonder die erste in der Liste !

somit mache

// First Static Row
if (databaseListItems.getFirstRow() == true) {

        tvSecondName.setAlpha(0.0f);
        Arrow.setAlpha(1.0f);

        tvFirstName.setTextColor(Color.parseColor("#161616"));
        row.setBackgroundColor(Color.parseColor("#f7f7f7"));
        row.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent=new Intent(context,OtherActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
            }
        });
    } else {

        tvSecondName.setAlpha(1.0f);
        Arrow.setAlpha(0.0f);


    }

zu

  // First Static Row
        if (position == 0){ //<-- HIER IST DIE AENDERUNG
        tvSecondName.setAlpha(0.0f);
        Arrow.setAlpha(1.0f);

        tvFirstName.setTextColor(Color.parseColor("#161616"));
        row.setBackgroundColor(Color.parseColor("#f7f7f7"));
        row.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent=new Intent(context,OtherActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(intent);
            }
        });
    } else {

        tvSecondName.setAlpha(1.0f);
        Arrow.setAlpha(0.0f);


    }

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

10.03.2016, 14:56:53 via Website

Das ist relativ einfach ;)

       DatabaseListItems staticItem= new DatabaseListItems();
     staticItem.setFirstRow(true);
                    staticItem.setFirstName("FIRST ROW");
                    staticItem.setSecondName(null);                        
databaseList.add(staticItem); // erstet Item hinzufügen

    Cursor c1 = dbHandler.selectQuery(query);
        if (c1.moveToFirst()) {
            do {
                DatabaseListItems databaseListItems = new DatabaseListItems();

                    databaseListItems.setFirstRow(false);

                    FirstRow = false;

                    databaseListItems.setFirstName(c1.getString(c1.getColumnIndex(DatabaseHelper.COLUMN_FIRSTNAME)));

                    databaseListItems.setSecondName(c1.getString(c1.getColumnIndex(DatabaseHelper.COLUMN_SECONDNAME)));


                databaseList.add(databaseListItems);

            } while (c1.moveToNext());
        }
        c1.close();

Einfach das Item erstellen und vor der Schleife der ArrayList hinzufügen.

Übrigens, das Flag istFisrtRow kannst du dir sparen.
Bei Listen hat man immer die Position und wenn Position==0 dann erstes Item

— geändert am 10.03.2016, 14:57:48

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

AndroidEntwickler

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

10.03.2016, 15:05:50 via Website

okay, danke - so klappt es auch mit weniger codezeilen :)
ALLERDINGS hat das mein eigentliches Problem nicht gelöst :(

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

11.03.2016, 08:16:27 via Website

niemand der helfen kann? :'(

Antworten
Fabian Simon
  • Forum-Beiträge: 359

11.03.2016, 11:10:07 via Website

Hat mein Vorschlag nicht die lösung gebracht ?

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

11.03.2016, 11:30:52 via Website

habe jetzt die If Bedienung geändert auf:

 if (position == 0)

Problem ist geblieben

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

11.03.2016, 11:35:10 via App

hast du die schleife mal angepasst?

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

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

11.03.2016, 11:39:43 via Website

ja, sieht jetzt so aus:

private void showList() {

    ArrayList<DatabaseListItems> databaseList = new ArrayList<>();
    databaseList.clear();


    DatabaseListItems staticItem= new DatabaseListItems();
    staticItem.setFirstName("FIRST ROW");
    staticItem.setSecondName(null);
    databaseList.add(staticItem);



    String query = "SELECT * FROM " + DatabaseHelper.DATABASE_TABLE;


    Cursor c1 = dbHandler.selectQuery(query);
    if (c1 != null && c1.getCount() != 0) {
        if (c1.moveToFirst()) {
            do {
                DatabaseListItems databaseListItems = new DatabaseListItems();

                databaseListItems.setFirstName(c1.getString(c1.getColumnIndex(DatabaseHelper.COLUMN_FIRSTNAME)));

                databaseListItems.setSecondName(c1.getString(c1.getColumnIndex(DatabaseHelper.COLUMN_SECONDNAME)));

                databaseList.add(databaseListItems);

            } while (c1.moveToNext()) ;
        }
        c1.close();

    } 

    DatabaseListAdapter databaseListAdapter = new DatabaseListAdapter(getActivity(), databaseList);
    ListView.setAdapter(databaseListAdapter);

}

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

11.03.2016, 11:53:22 via App

Sieht eigentlich ok aus.
Vielleicht mal debuggen und Log ausgaben machen.

— geändert am 11.03.2016, 11:53:31

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

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

11.03.2016, 11:54:44 via Website

und an welcher Stelle soll ich welche Log ausgaben machen?
Weiß ja nicht wonach ich suchen soll - bin total verzweifelt mittlerweile :/
habe schon so viele Stunden über dem Code gehangen und versteh es einfach nicht

habe gerade Mal folgende Log Ausgabe gemacht:

 if (position == 0) {

            Log.e("-->",""+position);
....

Bekomme als Ausgabe:

0 0 0 0

Das 4x Position == 0 sein soll verstehe ich jetzt nicht so wirklich

— geändert am 11.03.2016, 11:59:08

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

11.03.2016, 12:05:36 via App

Das heisst 4 mal wird die pos 0 geladen.
Ich schau mir das später mal an.

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

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

12.03.2016, 13:22:46 via Website

und, jemand ne Idee? :/

Antworten
Andy N.
  • Forum-Beiträge: 22.375

12.03.2016, 14:00:58 via Website

Hallo AndroidEntwickler,

Bitte nicht pushen, ich bin mir sicher, dass sich hier jemand melden wird, wenn er eine Antwort für dich hat. Danke (smug)

Viele Grüße,
Andy


OnePlus 3 (Resurrection Remix 5.8.2)
LG G Watch

Regeln | unsere Mods & Admins

Pascal P.

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

16.03.2016, 13:39:55 via Website

also mittlerweile bin ich ein Stück weiter gekommen (denke ich)

allerdings stürzt meine App ab, wenn ich einen Eintrag länger gedrückt halte:

java.lang.NullPointerException: Attempt to invoke virtual method
'android.view.View android.view.View.findViewById(int)' on a null
object reference at
xxx.Overview$2.onItemLongClick(Overview.java:72) at
android.widget.AbsListView.performLongPress(AbsListView.java:3127) at
android.widget.AbsListView$CheckForLongPress.run(AbsListView.java:3059)
at android.os.Handler.handleCallback(Handler.java:739) at
android.os.Handler.dispatchMessage(Handler.java:95) at
android.os.Looper.loop(Looper.java:148) at
android.app.ActivityThread.main(ActivityThread.java:5417) at
java.lang.reflect.Method.invoke(Native Method) at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

Das ist die betroffene Zeile:

ListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {

                final TextView ItemID = (TextView) ListView.getChildAt(position).findViewById(R.id.txtViewID);
        return FragementView;
    }

— geändert am 16.03.2016, 13:41:58

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

16.03.2016, 13:43:38 via Website

Ich würde nicht direkt mitt dem ListView objekt rbeiten.
Du bekommst doch deine view als view Parameter überfagen, damit kannst du einfach view.findViewById(..); etc. machen.
Dann sollte es auch keine NPE geben

— geändert am 16.03.2016, 13:50:12

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

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

16.03.2016, 13:47:18 via Website

VIELEN DANK ! :)

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

16.03.2016, 13:50:26 via Website

Hat es funktioniert? ;)

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

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

16.03.2016, 13:51:10 via Website

Zumindest stürzt die app nicht mehr ab. werde weitere Tests machen und beobachten :)

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

16.03.2016, 14:43:41 via Website

also scheint alles zu klappen wie gewünscht.

ABER bin auf ein neues / ähnliches Problem gestoßen.
ich habe einen button womit ich in jeder row (eigentlich) eine checkbox einblenden lasse.
dieser Code wurde dabei ausgeführt:

x = 1;
while (x < ListView.getChildCount()) {
    CheckBox SelectCheckBox = (CheckBox) ListView.getChildAt(x).findViewById(R.id.SelectCheckBox);
    SelectCheckBox.setChecked(false);

    SelectCheckBox = (CheckBox) ListView.getChildAt(x).findViewById(R.id.SelectCheckBox);
    SelectCheckBox.alpha = 1.0;

    x++;
}

Sieht auf den ersten Blick wieder super aus:
image

Allerdings wenn ich wieder mal runter scrolle, habe die nächsten Zeilen die Checkbox nicht eingeblendet bekommen, als würde sich der o.g. Code nur auf die sichtbaren Zeilen auswirken:

image

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

16.03.2016, 14:47:47 via Website

Über die schelife wirkt es sich auch nur auf die Sichtbaren aus.
Du musst, wenn du es für alle willst im Adapter die getView überschreiben und bei gesetzter boolean (musst ud definieren) dann die checkBox einblenden.
Alternative wäre, die schleife bei jedem scollen urchzugehen, das ist aber ineffektiv.

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

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

17.03.2016, 07:42:35 via Website

jaaaaa und irgendwie nein ^^

habe den code part jetzt entfernt und im adapter ohne while schleife bei get view eingefügt.
die checkboxen erscheinen dann auch bei allen rows, allerdings sieht man wie beim scrollen diese nach und nach erscheinen.
sieht irgendwie unschön aus ...
möchte im Endeffekt bei allen rows auf ein Mal die Checkboxen haben, egal ob ich scrolle oder nicht.

geht das irgendwie? :/

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

17.03.2016, 09:03:58 via Website

UPDATE

Wenn ich den o.g. Code für die Checkboxen doch mit einer Schleife mache und nicht im Adapter, dann soll meine Schleife lt. Internet so aussehen:

for ( int i=0; i < listview.getAdapter().getCount(); i++) {
   // DO SOMETHING
}

Damit würden dann alle Zeilen der Liste und nicht nur die sichtbaren Zeilen durchlaufen werden.
Problem was ich habe:

Wie müsste dann diese Zeile aussehen:

SelectCheckBox = (CheckBox) listview.getChildAt(i).findViewById(R.id.SelectCheckBox);

Denn da stürzt mir die App logischerweise mit NullPointerException ab

— geändert am 17.03.2016, 09:18:23

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

17.03.2016, 12:17:21 via Website

Ist klar, mit listview.getChildAt(i) bekommst du immer nur View zurück die Sichtbar in der ListView sind.
Du müsstest sowas machen:

View v = listview.getAdapter.getView(i,null,listview);
SelectedCheckBox = (CheckBox) v.findViewById(..);

Das ausführen dieses efehls in der Schleife kann je nach anzehl der Einträge variieren.
Und wenn du die getView richtig überschrieben hast, sollte es auch gehen.

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

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

17.03.2016, 12:23:33 via Website

mmmmh,

habe ich jetzt so gemacht - app stürzt nicht ab - allerdings werden die Checkboxen nicht eingeblendet
was meinst du mit getView richtig überschrieben?

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

17.03.2016, 12:27:40 via Website

wie ieht denn den getView Code aus?

Du darfst nämlich nur ein Inflate der View machen wenn diese noch nicht existiert.

Und ich merke gerade das ist das Problem.
Mein denkfehler sorgt dafür, dass es einen "Teufleskreis" gibt und die CheckBoxen zwar kurz angezeigt werden aber dann sofort wieder aus.

Was ich mich frage, warum hast du nicht auf die Standard Methode der CheckBoxListView zurückgegriffen?Da hast du doch alles was du brauchst.

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

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

17.03.2016, 12:29:12 via Website

ist denn CheckBoxListView auch in kombi mit einem custom list view möglich?
die checkbox ist ja nicht das einzige was custom bei mir ist ^^

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

17.03.2016, 12:34:59 via Website

Ich hatte mich mal wieder getäsucht bzw. mit einer anderen Programmiersprache verwechselt.
Für checkListViews in android nimmt man eine CutomListView:
http://www.mysamplecode.com/2012/07/android-listview-checkbox-example.html

Das andere gibts nur bei WinDesktop ;)

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

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

17.03.2016, 12:58:17 via Website

okay, also alles wieder auf Anfang ^^

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

18.03.2016, 11:54:17 via Website

Also, was könnte ich denn noch machen?

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

18.03.2016, 11:57:19 via App

Ich kann mir das mal anschauen. Müsste eigentlich einfach lösbar sein.
Ich melde mich wenn ich was hab.

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

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

18.03.2016, 11:58:15 via Website

schon Mal vielen Dank :)
hoffe wir bekommen das schnell gelöst - ist echt ein fieser "bug" in der app :/

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

18.03.2016, 13:08:58 via Website

kurze Zwischenfrage, vllt kann ich damit mein Problem schon selber lösen.

wie kann ich aus meiner activity via Menu Button Prozesse durchführen lassen, welche im Adapter vorkommen:

Activity

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

        case R.id.button:
           // DO SOMETHING IM ADAPTER GET VIEW
            break;
    }


    return super.onOptionsItemSelected(item);
}

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

18.03.2016, 13:24:46 via App

Ich verstehe dir frage nucht ganz?
Welchr Prozesse im Adapter meinst du?

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

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

18.03.2016, 13:26:51 via Website

in meiner activity habe ich den o.g. code.
möchte jetzt, wenn menu button gedrückt wird, der code für das Einblenden der Checkboxen (welcher aktuell testweise wieder im getView vom Adapter steht) ausgeführt wird

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

18.03.2016, 13:39:24 via App

Das geht nicht. Du kannst nur Schleife und Adapter kombinieren.

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

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

18.03.2016, 13:41:17 via Website

ou man ist das alles kompliziert.
im Endeffekt möchte ich es doch nur schaffen, wenn ich ein menu item anklicke, dass in allen rows meine ausgeblendeten checkboxes eingeblendet werden... :'(

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

18.03.2016, 13:46:37 via App

Warum sollen diese denn überhaupt ausgeblendet werden?

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

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

18.03.2016, 13:48:17 via Website

weil die nur zum löschen angezeigt werden soll. außerdem nehmen die platz weg, wenn diese die ganze zeit angezeigt werden würden

— geändert am 18.03.2016, 13:48:27

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

18.03.2016, 14:34:31 via Website

Damit hast du recht, aber ich weiss nicht wo dein Problem liegt.
Habe das gerade bei mir im Testprojekt nachgestellt und es funktioniert eiwandfrei:

Hier mal mien Code ( etwas vereinfachter als bei dir, aber Prinzip ist das gleiche):

//Klassenvariablen definieren
boolean showCheckBoxes = false;
ArrayAdapter<String> adapter; 

//dann irgendwo später in on Create o.ä.


 adapter = new ArrayAdapter<String>(this,R.layout.list_item,list) // Vaiable List wäre nur meine DataSource Liste, welche bei dir ja ein Curso ist, aber ist egal
        {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                if(convertView==null)
                {
                    convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.list_item,null); // View inflaten
                }

                CheckBox box = (CheckBox)convertView.findViewById(R.id.checkBox1); //CheckBox suchen
                TextView txt = (TextView)convertView.findViewById(R.id.code); // TextBox suchen
                txt.setText(getItem(position)); // String text setzen

                if(showCheckBoxes ) // Wenn klassenvariable = true
                {
                    box.setVisibility(View.VISIBLE);// dann checkbox sichbar
                }
                else
                {
                    box.setVisibility(View.GONE); // sonst unsichbar
                }

            return convertView;
            }
        };



        listView.setAdapter(adapter); // adapter setzen






// Dann wieder irgendwo bei deinem OptionsMenu:

 if(item.getItemId() == R.id.ttt)
        {
           showCheckBoxes = !showCheckBoxes ; // Toggle boolean status damit im wechel an und aus
            adapter.notifyDataSetChanged(); //Adapter anweisen, Views zu aktualisieren
        }

PS: Ich würde den Code im Menu Item ja zusätzlich auf ein LongClick an der ListView legen, denn so ist es standardmäßig, dass items über long klick barbeitet/gelöscht werden können.

— geändert am 18.03.2016, 14:35:02

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

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

18.03.2016, 18:57:59 via Website

vielen dank für deine Hilfe.
auch wenn es für dich vllt jetzt einfach erscheint, aber ich steh aktuell total aufm schlauch und weiß nicht mehr wo was genau hin soll.

wenn du dir bitte meinen code aus post 1 anschauen würdest.
könntest du mir anhand dieses code sagen wo dein code überall hin soll? :/

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

18.03.2016, 19:30:02 via Website

Eigentlich ist es recht simpel, du musst eigentlich das hier in der GetView hinzufügen:

 if(showCheckBoxes ) // Wenn klassenvariable = true
            {
                box.setVisibility(View.VISIBLE);// dann checkbox sichbar
            }
            else
            {
                box.setVisibility(View.GONE); // sonst unsichbar
            }

Dafür brauchst du halt die Varable box als CheckBox und die Klassenvariable showCheckBoxes.

Dann musst du nur noch zugriff auf deinen Adapter als Klassenvar bekommen und erledigt hat sich die sache indem du bei Manu click das aufrufst:

 showCheckBoxes = !showCheckBoxes ; // Toggle boolean status damit im wechel an und aus
        adapter.notifyDataSetChanged(); //Adapter anweisen, Views zu aktualisieren

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

Antworten
AndroidEntwickler
  • Forum-Beiträge: 58

18.03.2016, 22:42:29 via Website

habe ich jetzt soweit gemacht.
aber wie soll ich in meiner main activity das hier einfügen:

 showCheckBoxes = !showCheckBoxes ; // Toggle boolean status damit im wechel an und aus
        adapter.notifyDataSetChanged(); //Adapter anweisen, Views zu aktualisieren

showCheckBoxes gibt es dort doch nicht.
das deklariere ich ja im DatebaseListAdapter

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

18.03.2016, 22:47:29 via Website

Ne das deklarierst du in der Activity welche die ListView besitzt, außer du hast eh einen Adapter, dann passt das da.

Sonst musst du die boolean public machen und diese dann im Adapter ändern

— geändert am 18.03.2016, 22:48:34

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

Antworten
Benn
  • Forum-Beiträge: 143

18.03.2016, 22:49:41 via Website

Computer Sprache sieht so kompliziert aus
das ist ja wie hohe Mathematik irgendwie.
Auf den ersten blick .

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

18.03.2016, 22:55:32 via Website

Ach das geht klar, wenn man es verstanden hat ;)
Das ist so wie wenn du mit dem PC redest und er deine Befehle ausführt

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

Antworten