ViewPager - nur noch bestimmte Items anzeigen lassen?

  • Antworten:10
Christian Hackbusch
  • Forum-Beiträge: 14

08.06.2017, 12:42:21 via Website

Hallo zusammen,

Ich habe mal eine allgemeine Verständnisfrage. Und zwar habe ich einen ViewPager und die zugehörige Adapter Klasse. In der Main Activity gibt es im Menu einen Filter Button. Wenn der geklickt wird sollen nur noch Items im ViewPager angezeigt werden, die eine bestimmte Voraussetzung erfüllen. Anstatt 10 Items sind dann z.B. nur noch 7 angezeigt.

Kann mir jemand sagen, mit was man in diesem Fall arbeiten muss und wie das abläuft? Geht mir gerade nur darum, das ganze mal zu verstehen um dann mal den Versuch wagen zu können, es umzusetzen.

Danke! (*)

Antworten
swa00
  • Forum-Beiträge: 3.704

08.06.2017, 12:48:23 via Website

Hallo Christian,

du musst dir deine eigene Mimik bauen, welches Fragement valid ist oder nicht.

Bei getCount gibst du dann die Anzahl zurück und in getItem verwaltest du deine Fragmente

Liebe Grüße - Stefan
[ App - Entwicklung ]

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

08.06.2017, 13:04:33 via Website

Am besten du schaust, was das aktuelle Fragment ist.
Mal ein ausschnitt wie ich das gelöst habe:
public class SectionsPagerAdapter extends FragmentPagerAdapter {

       private Fragment mCurrentFragment;

 public Fragment getCurrentFragment() {
            return mCurrentFragment;
        }

 @Override
        public void setPrimaryItem(ViewGroup container, int position, Object object) {
            if (getCurrentFragment() != object) {
                mCurrentFragment = ((Fragment) object);//neues Fragment ist aktiv             
            super.setPrimaryItem(container, position, object);
        }
...
}

Aus der Activity kannst du dann vom Pager getCurrentFragment aufrufen, und dem Fragment dann das Filter mitgeben (dabei daraufachten, dass du dasl allg. Fragment in deine FragmentKlasse castest)

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

swa00

Antworten
swa00
  • Forum-Beiträge: 3.704

08.06.2017, 13:14:05 via Website

Öhm :-) (FragmentStatePagerAdapter)

/////////////////////////////////////////////////////////////////////////////////////////
@Override
public int getCount() {return //  Anzahl deiner Fragmente;}
/////////////////////////////////////////////////////////////////////////////////////////
@Override
public Fragment getItem(int position)
{
   switch (position) 
   {
    case 0 :  return (DeinFragmentAn Position0); break;
    // usw 
   }
   return null;
}

— geändert am 08.06.2017, 13:32:31

Liebe Grüße - Stefan
[ App - Entwicklung ]

Christian Hackbusch

Antworten
swa00
  • Forum-Beiträge: 3.704

08.06.2017, 13:20:13 via Website

So habe ich es umgesetzt

image

image

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
Christian Hackbusch
  • Forum-Beiträge: 14

08.06.2017, 13:47:27 via Website

Hey Pascal! Ich glaube ich habe da etwas grundlegendes verwechselt... Ich habe einen

public class SwipeAdapter extends PagerAdapter  {
} 

Entschuldigt die Verwirrung...
Funktioniert das denn mit einem SwipeAdapter?

Bin gerade etwas ratlos :?

Antworten
swa00
  • Forum-Beiträge: 3.704

08.06.2017, 13:52:03 via Website

Entschuldigt die Verwirrung..

Nööö, du hast jetzt verspielt :-)

EDIT : PageAdapter
https://developer.android.com/reference/android/support/v4/view/PagerAdapter.html

Schau dir mal die SubClasses an -> FragmentStatePagerAdapter -> Post von Stefan

— geändert am 08.06.2017, 13:56:33

Liebe Grüße - Stefan
[ App - Entwicklung ]

Christian HackbuschPascal P.

Antworten
Christian Hackbusch
  • Forum-Beiträge: 14

08.06.2017, 20:47:24 via Website

Hey Pascal. Erstmal danke dafür! (cool) getCurrentFragment brauche ich glaub ich gar nicht mehr, da ich das aktuelle Item / Fragment immer schon anders in die Activity bekomme (gibt mir ja so wie es aussieht nur die aktuelle Position).

Was genau meinst du mit "dem Fragment dann das Filter mitgeben (dabei daraufachten, dass du das allg. Fragment in deine FragmentKlasse castest)" ? Wie wird der Filter mitgegeben?

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

08.06.2017, 21:05:11 via Website

Das kommt darauf an was du filtern willst.

Hier bin ich mir gerade nicht danz sicher:
Ich glaube du hast eine Liste im Fragment und willst diese Filtern.
Stefan hat dich so verstanden, dass du die Viewpager Fragments und positionen anpassen willst.

Wer von uns beiden liegt richtig?

Solle ich richtig liegen :P ;):
Mit getCurrentFragment bekommst du dein Fragment objekt.
Wenn du das dann in z.b. MyFragment (angenommen deine FragmentKlasse heißt so) castest, kannst du direkt MyFragment#filter oder so aufrufen.

Dann musst du in deiner Fragment Klasse eine Methode namens filter implementieren, die dir das Array in deinem ListAdapter passend filtert.

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

swa00Christian Hackbusch

Antworten
Christian Hackbusch
  • Forum-Beiträge: 14

08.06.2017, 21:19:55 via Website

Jetzt mal nur um Klarheit zu schaffen (laughing) So sieht mein Adapter aus:

public class SwipeAdapter extends PagerAdapter  {

/*
    Define the image resources for our image fragment
 */
private int[] image_resources = {
        R.drawable.island_1,
        R.drawable.island_2,
        R.drawable.island_3,
        R.drawable.island_4,
        R.drawable.island_5,
        R.drawable.island_6,
        R.drawable.island_7,
        R.drawable.island_8,
        R.drawable.island_9,
        R.drawable.island_10
};

private Context context;
private LayoutInflater layoutInflater;

public SwipeAdapter(Context context) {
    this.context = context;
}

/*
    Count the images in image_resources array
  */
@Override
public int getCount() {
    return image_resources.length;
}

@Override
public boolean isViewFromObject(View view, Object object) {
    return (view == (LinearLayout) object);
}

/*
    Create the page for the given position
    Set image resources and text about current position
 */
@Override
public Object instantiateItem(ViewGroup container, int position) {
    layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View item_view = layoutInflater.inflate(R.layout.swipe_layout,container,false);
    ImageView imageView = (ImageView) item_view.findViewById(R.id.swipe_image);
    TextView textView = (TextView) item_view.findViewById(R.id.image_count);
    ImageButton imageButton = (ImageButton) item_view.findViewById(R.id.favourite_button);

    imageView.setImageResource(image_resources[position]);

    textView.setText("["+(position+1)+"/10]");

    SharedPreferences prefs = context.getSharedPreferences("favInfo", Context.MODE_PRIVATE);

    // get the unique key consisting of fav and the current item position
    String key = "fav" + (position+1);
    imageButton.setTag(position+1);

    String value = prefs.getString(key, "0");

    // check if value of favorite key is 0
    // set image resource dependent on what value is set
    if (value.equals("1")) {
        imageButton.setImageResource(R.drawable.heart_red);
    } else {
        imageButton.setImageResource(R.drawable.heart);
    }

    container.addView(item_view);

    return item_view;
}

/*
    Remove a page for the given position
 */
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    container.removeView((LinearLayout) object);
}
}

Ist jetzt nicht alles relevant für die Problemstellung hier, aber bevor ich mich da nochmal verplapper :D Die aktuelle Position bekomm ich in der Main Activity dann wieder über imageButton.getTag()-1 (so in der Art), das klappt auf jeden Fall.

In meinen SharedPreferences gibt es insgesamt 10 keys fav1 bis fav10 mit den values 0 oder 1. Ich müsste dann die items rausfiltern, die ein value von 1 hinterlegt haben und nur die anzeigen.

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

08.06.2017, 21:41:43 via Website

Naja, das einfachste hier wird sein, dir ein dynamisches Array zusammen zu bauen und damit den Adapter zu befüllen.

Das dynamische Array besitzt dann nur die Elemente, für welche in den Prefs der Wert 1 gespeichert ist. Wenn das erledigt ist musst du nurnoch den Adapter aktualisieren.

Ich hatte angenommen du hast hier andere DAten zu grunde liegen, anstatt statische Drawables ;)

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

Antworten