2012-04-24 10 views
6

Mam sytuację dla mojej aplikacji na Androida. Scenariusz: używam adaptera strony widzącej, mam 3 strony, które są w rzeczywistości fragmentami. Moje problemy to to, że chcę zaktualizuj je z okna dialogowego. Okno dialogowe zawierające listę, z której zdarzenia onclick chcę zaktualizować fragment.Jak odświeżyć fragment w viewpageadapter przez inną działalność

Po pierwsze jest to możliwe, jeśli tak, zrób chip i pomóż mi.

Cheers Gaurav

To jest moja strona widok adapter

/* 
* Copyright (C) 2012 Gaurav Rawat 
* 
*/ 
package com.punksrant.ifinddryday.adapter; 

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 

import com.punksrant.ifinddryday.fragment.AllFragment; 
import com.punksrant.ifinddryday.fragment.HomeFragment; 
import com.punksrant.ifinddryday.fragment.SynchFragment; 
import com.punksrant.ifinddryday.utils.IFindDryDaysConstants; 
import com.viewpagerindicator.TitleProvider; 

public class ViewPagerAdapter extends FragmentPagerAdapter implements 
     TitleProvider { 

    private static String[] titles = IFindDryDaysConstants.titles; 

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

    @Override 
    public String getTitle(int position) { 
     return titles[position % titles.length].toUpperCase(); 
    } 

    @Override 
    public int getCount() { 
     return titles.length; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     Fragment fragment; 
     switch (position) { 
     case 0: 
      fragment = HomeFragment.newInstance(); 
      break; 
     case 1: 
      fragment = AllFragment.newInstance(); 
      break; 

     case 2: 
      fragment = SynchFragment.newInstance(titles[position 
        % titles.length]); 
      break; 

     default: 
      fragment = HomeFragment.newInstance(); 
     } 
     return fragment; 
    } 

} 
' and in this I want to refresh the home fragment from my dialog class 
'/* 
* Copyright (C) 2012 Gaurav Rawat 
* 
*/ 
package com.punksrant.ifinddryday.activity; 

import roboguice.inject.ContentView; 
import roboguice.inject.InjectView; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 

import com.github.rtyley.android.sherlock.roboguice.activity.RoboSherlockFragmentActivity; 
import com.google.inject.Inject; 
import com.punksrant.ifinddryday.model.Coordinates; 
import com.punksrant.ifinddryday.utils.DryDayJSONResParser; 
import com.punksrant.ifinddryday.utils.IFindDryDayViewUtils; 

@ContentView(R.layout.statedialog) 
public class Dialog extends RoboSherlockFragmentActivity { 
    @InjectView(R.id.dialogList) 
    ListView listView; 
    @Inject 
    SharedPreferences preferences; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     String[] states = DryDayJSONResParser.getSupportedStates(); 
     listView.setAdapter(new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, android.R.id.text1, states)); 
     listView.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       String state = ((TextView) view).getText().toString(); 
       Coordinates coordinates = IFindDryDayViewUtils 
         .getCoordinatesFromPreferences(preferences); 
       coordinates.setState(state); 
       IFindDryDayViewUtils.updateCityFromLocation(coordinates, 
         preferences); 

       finish(); 
      } 

     }); 
    } 
}, 
+0

Gdzie jest twój adapter strony poglądowej ?. Czy możesz opublikować kod działania przypisanego do przeglądarki? – gutiory

+0

Hi @gutiory wklei kod po powrocie do domu, w rzeczywistości jist jest używany Jake's ViewPagerIndicator library.https: //github.com/JakeWharton/Android-ViewPagerIndicator z fragmentami dodawanymi z fragmentpageadapter .Pokaż ten kod jak najszybciej Wróciłem. –

+0

To jest adapter mojej strony widoku –

Odpowiedz

1

(kredyty do blahdiblah rui.araujo) Istnieje kilka sposobów, aby to osiągnąć.

Pierwsza opcja jest łatwiejsza, ale bardziej nieefektywna.

Zastąp getItemPosition w swojej PagerAdapter tak:

public int getItemPosition(Object object) { 
    return POSITION_NONE; 
} 

W ten sposób, gdy dzwonisz notifyDataSetChanged(), widok pager usunie wszystkie poglądy i przeładować je wszystkie. W ten sposób uzyskuje się efekt przeładowania.

Druga opcja, suggested by alvarolb, to metoda setTag() w instantiateItem() podczas tworzenia nowego widoku. Zamiast korzystać z notifyDataSetChanged(), możesz użyć findViewWithTag(), aby znaleźć widok, który chcesz zaktualizować.

Drugie podejście jest bardzo elastyczne i wydajne. Kudos do alvarolb dla oryginalnych badań.

Powiązane problemy