SwipeView und ListFragment

  • Antworten:9
boehse04
  • Forum-Beiträge: 15

31.07.2014, 18:14:26 via Website

Hallo zusammen,

ich arbeite zur Zeit an einer App, die 2 Tabs beinhaltet. Der eine Tab beinhaltet ein ListView. Daher habe ich das entsprechende Fragment mit ListFragment vererbt um Zugriff auf die entsprechenden Methoden zu haben.
Nun stürzt die App allerdings immer ab.
Wenn ich aus dem ListFragment nur ein Fragment mache und den entsprechenden Code auskommentiere, der nicht funktioniert ohne ein ListFragment, stürzt die App nicht ab.
Ich poste hier den relevanten Code.
Ich würde mich über eine Antwort freuen.
Danke schon einmal im Vorraus.

 public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a PlaceholderFragment (defined as a static inner class
        // below).

        if (position == 0) {
            return new PersonFragment();
        } else {
            return new SettingsFragment();
        }

    }

    @Override
    public int getCount() {
        // Show 2 total pages.
        return 2;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        Locale l = Locale.getDefault();
        switch (position) {
        case 0:
            return getString(R.string.tab_persons).toUpperCase(l);
        case 1:
            return getString(R.string.tab_settings).toUpperCase(l);
        }
        return null;
    }
}

public static class PersonFragment extends ListFragment {
    /**
     * The fragment argument representing the section number for this
     * fragment.
     */
    private static final String ARG_SECTION_NUMBER = "section_number";

    /**
     * Returns a new instance of this fragment for the given section number.
     */
    public static PersonFragment newInstance(int sectionNumber) {
        PersonFragment fragment = new PersonFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    public PersonFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.fragment_person,
                container, false);

        setListAdapter(adapter);

        rootView.findViewById(R.id.btn_add).setOnClickListener(
                new View.OnClickListener() {

                    public void onClick(View v) {
                        EditText edit = (EditText) rootView.findViewById(R.id.edittxt);
                        list.add(edit.getText().toString());
                        edit.setText("");
                        adapter.notifyDataSetChanged();
                    }
                });

        rootView.findViewById(R.id.btn_del).setOnClickListener(
                new View.OnClickListener() {


                    public void onClick(View v) {
                        SparseBooleanArray checkedItemPositions = getListView().getCheckedItemPositions();
                        int itemCount = getListView().getCount();

                        for(int i=itemCount-1; i >= 0; i--) {
                            if(checkedItemPositions.get(i)) {
                                adapter.remove(list.get(i));
                            }
                        }
                        checkedItemPositions.clear();
                        adapter.notifyDataSetChanged();
                    }
                });

        return rootView;
    }
}

Antworten
Luca T.
  • Forum-Beiträge: 62

31.07.2014, 20:05:28 via Website

Ich bin mir nicht ganz sicher, aber ich glaube die getItem() Methode des ViewPagers erwartet ein "normales" Fragment und kann mit dem ListFragment nichts anfangen. Ähnlichse hatte ich auch mal. Ein LogCat auszug wäre nicht schlecht.
Nimm doch einfach ein normales Fragment, die betreffenden Methoden kannst du ja alle manuell mit Listenern etc. erzeugen.

Antworten
boehse04
  • Forum-Beiträge: 15

31.07.2014, 20:10:18 via Website

Wie soll ich die Methoden denn dann aufrufen?
Das ist mir nicht ganz klar, weil zum Beispiel die Methode setListAdapter(adapter) nur in ListFragment oder ListActivity beinhaltet ist oder sehe ich das etwa falsch?

Antworten
Luca T.
  • Forum-Beiträge: 62

31.07.2014, 20:14:17 via Website

Die ListActivity hilft dir nur, du bekommst aber alle Methoden auch so zum laufen.

ListView lv = (ListView) findViewByID(R.id.blabla);
//neuer adapter
lv.setAdapter(adapter);

kein setListAdapter in dem Fall sondern nur seAdapter.

Antworten
boehse04
  • Forum-Beiträge: 15

31.07.2014, 20:27:09 via Website

Super danke für die Antwort hat super geklappt!
Jetzt habe ich aber ein neues Problem.
Wenn ich etwas in meinen EditText eintrage und auf den AddButton drücke, stürzt die App wieder ab.
Eigentlich sollte der Code in der oben geposteten onClick Methode doch funktionieren oder?
Also habe jetzt nur noch deine Änderung eingebaut.

Antworten
boehse04
  • Forum-Beiträge: 15

31.07.2014, 20:29:19 via Website

Ich schätze mein Fehler liegt in dieser Code-Zeile hier weil ich mir nicht sicher bin was an der Stelle an der nunm R.layout.fragment_person steht wirklich eingesetzt werden muss.
Das dort eingetragene Fragment ist das, was auch gestartet wird. list ist meine ArrayList.

adapter = new ArrayAdapter<String>(this, R.layout.fragment_person, list);

Antworten
Luca T.
  • Forum-Beiträge: 62

31.07.2014, 20:39:55 via Website

In den ArrayAdapter kommt als zweiter Parameter ja dein Custom Layout, und ich habs noch nicht ausprobiert, aber soweit ich weiß mag der da keine Fragments. Also versuchs mal mit nem normalen Layout.
Ansonsten kann ich dir schon direkt sagen, dein Delete Button wird auch nicht funktionieren:p
getListView() ist die Methode der ListActivity um die ListView zu bekommen, die du ja jetzt manuell in der onCreate erzeugst, das musst du auf jeden fall schonmal mit deiner manuell erzeugten ListView ersetzen würde ich sagen
Außerdem holt man sich die Referenzen der Views, also das

EditText edit = (EditText) rootView.findViewById(R.id.edittxt);

am besten schon in der onCreate() bzw. in der getItem() Methode

Ansonsten immer die LogCat mit ins Forum posten, dann findet man die Fehler auch besser.

Antworten
boehse04
  • Forum-Beiträge: 15

31.07.2014, 20:41:07 via Website

Danke ich habe es schon gefixt bekommen.
Die Zeile braucht ein Android Standard Layout.
Nun lautet der Aufruf des Konstruktors:

adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, list);

Antworten
boehse04
  • Forum-Beiträge: 15

31.07.2014, 21:01:17 via Website

Luca T.

Ansonsten kann ich dir schon direkt sagen, dein Delete Button wird auch nicht funktionieren:p
getListView() ist die Methode der ListActivity um die ListView zu bekommen, die du ja jetzt manuell in der onCreate erzeugst, das musst du auf jeden fall schonmal mit deiner manuell erzeugten ListView ersetzen würde ich sagen

Das war mir klar das meinte ich eben auch damit das ich deine Änderung schon eingebaut habe ;)

Antworten
Luca T.
  • Forum-Beiträge: 62

31.07.2014, 21:11:46 via Website

Ok, dann ist ja gut^^

Antworten