Implementera View Swiping för API level 14

Diskussion i 'Frågor, support och diskussion' startad av e7andy, 25 apr 2012.

  1. e7andy

    e7andy Professional Droid Hedersmedlem

    Blev medlem:
    14 okt 2009
    Inlägg:
    2 342
    Mottagna gillanden:
    821
    Telefon:
    Huawei P10 Plus

    MINA ENHETER

    Telefon:
    Huawei P10 Plus
    Telefon 2:
    Nexus 5
    Telefon 3:
    ADP1
    Övrigt:
    LG G Watch R, ChromeCast
    Jag håller på och bygger en app med API-level 14, dvs. 4.0 så jag har tillgång till alla nya häftiga klasser.

    Det jag inte förstår är hur jag ska bygga View Swiping.
    Jag har hittat många diskussioner och exempel på hur man bygger det med compatibility package, men borde det inte gå att bygga det utan att ta in det när jag valt att köra på API 14?

    Det jag vill bygga är något som ser ut som i Google+:
    [​IMG]
    Jag vill ha 6 sidor som visar olika typer av listor som användaren kan bläddra mellan genom att dra med fingret höger och vänster.
    Det ska även markeras längst upp var användaren befinner sig precis som i Google+.

    Den tanken jag har är att ha en ListFragment-klass som kan visa listor med items. Sen lägger jag till 6 stycken instanser av den till min aktivitet där jag till varje instans sätter olika adapters som innehåller just de items som ska visas.

    Jag vill helst implementera det här utan att ta in några externa bibliotek eller använda för mycket kod från andra. Går inte det här att bygga smidigt med standard-klasserna?

    Edit:
    Här hittade jag något som verkar intressant, men använder fortfarande paketet support.v4:
    http://www.techrepublic.com/blog/ap...er-widget-and-the-actionbar-fragment-tabs/884
    Här är utan support.v4, men med fasta tabs och utan swiping(?):
    http://developer.android.com/resour...om/example/android/apis/app/FragmentTabs.html

    Det här är nog det bästa och mest "officiella" jag hittat (fortfarande med support.v4...är det så att jag måste lägga till det?):
    http://developer.android.com/training/implementing-navigation/lateral.html#horizontal-paging
     
    Last edited: 25 apr 2012
  2. nadam

    nadam Youth Droid Medlem

    Blev medlem:
    10 feb 2010
    Inlägg:
    182
    Mottagna gillanden:
    31
    Operatör:
    Hallon
    Telefon:
    Sony Xperia XZ1 Compact

    MINA ENHETER

    Operatör:
    Hallon
    Telefon:
    Sony Xperia XZ1 Compact
    Japp, ViewPager finns bara i compatibility package. Lite märkligt, men bra att kunna stödja flera versioner av Android.
     
    e7andy gillar detta.
  3. e7andy

    e7andy Professional Droid Hedersmedlem

    Blev medlem:
    14 okt 2009
    Inlägg:
    2 342
    Mottagna gillanden:
    821
    Telefon:
    Huawei P10 Plus

    MINA ENHETER

    Telefon:
    Huawei P10 Plus
    Telefon 2:
    Nexus 5
    Telefon 3:
    ADP1
    Övrigt:
    LG G Watch R, ChromeCast
    Jag har kommit väldigt långt med det här, men har den här veckan stött på ett riktigt stort problem som jag har kommit på en lösning till idag.

    Min implementation:
    En FragmentActivity som har en ViewPager.
    ViewPager har en FragmentPagerAdapter.
    I FragmentPagerAdapter så skapas det upp 6 stycken ListFragment.
    Varje ListFragment har en ArrayAdapter som ska hålla sina Items.
    Jag lägger till Items till varje adapter beroende på vilken status ett item har med:
    fragmentPagerAdapter.getItem(listIndex).getAdapter().add(item);
    Det fungerar galant första gången jag visar mina listfragment.

    Problemet:
    När jag vrider på telefonen så skapas allt om via onDestroy() och onCreate() som det ska, men mina listfragment blir tomma. Jag har skapat om dem så det borde bli samma sak som första gången jag laddar allt.
    Felet beror på att Android återanvänder listfragmenten som skapades första gången och de är inte samma jag som lägger till mina items till. Därför blir listorna tomma.
    Jag använder getItem() för att få tag i mitt listfragment, men det gör inte Android. Den anropar inte ens getItem() andra gången utan letar reda på dem via instantiateItem().

    Min lösning:
    Lösningen känns lite som ett hack, men fungerar väldigt bra (det skapas dock upp några extra fragment, men det är nog inte jätteofta som användarna kommer att vrida telefonen fram och tillbaks just i listvyn där det här används):
    Gör en override på: public Object instantiateItem(ViewGroup container, int position) i FragmentPagerAdapter:
    Kod:
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
    	ItemsFragment fragment = (ItemsFragment) super.instantiateItem(container, position);
    	if(fragment.getAdapter() == null) {
    		ItemsFragment myFragment = getItem(position);
    		fragment.setListAdapter(myFragment.getAdapter());
    		fragment.setTitle(myFragment.getTitle());
    	}
    	return fragment;
    }
    Notera: Mitt ItemsFragment har en metod getAdapter() som returnerar en typad adapter "ItemListAdapter" och metoder för set och getTitle() som används för att få rätt texter på PagerTitleStrip i ViewPagern.

    Jag använder min metod getAdapter() för att kolla om det funna fragmentet har en adapter. Om den inte har det så tar jag en adapter via metoden getItem() som returnerar fragments som jag har kontroll på.

    Ni kanske undrar varför jag helt enkelt inte bara lägger till android:configChanges="orientation|keyboardHidden|screenSize" i manifestet. För det första så ska den tekniken undvikas eftersom det gör hanteringen av resources onödigt komplicerad. Vidare så hanteras inte ActionBar och PagerTitleStrip korrekt.

    Nästa steg nu är att använda onRetainCustomNonConfigurationInstance och getLastCustomNonConfigurationInstance för att slippa ladda om all data mellan vridningarna av telefonen.
     
    Last edited: 21 maj 2012