2015-07-22 17 views
6

Ho due frammenti su un cercapersone di visualizzazione. Una volta ho dovuto spostare i dati dal frammento B ad A e aggiornare i dati visualizzati su A e l'ho fatto con getItemPosition. Per qualche ragione, lo stesso metodo non funziona quando si tenta di ripristinare tutti i dati ..Visualizzazione dati di aggiornamento su un frammento

Nel mio adattatore ho:

public void refresh() 
    { 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getItemPosition(Object obj) 
    { 
     return POSITION_NONE; 
    } 

nel frammento in cui clicco 'reset':

@Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     notTriedPasswordsList = PagerActivity.mainList; 
..... 
.... 
    resetButton.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) 
        { 
         PagerActivity.resetPasswords(); 
         PagerActivity.viewPagerAdapter.refresh(); 
        }}); 

attività viewPager ospitano entrambi i frammenti:

public static void resetPasswords() 
    { 
     mainList.addAll(0, historyList); 
     historyList.clear(); 
     PagerActivity.viewPagerAdapter.refresh(); 
    } 

frammento principale whe re viene visualizzato il passaggio:

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

..... 
     nextCodeDisplay = (TextView) view.findViewById(R.id.passwordDisplayTextView); 
     nextCodeDisplay.setText(notTriedPasswordsList.get(0).getPasswordString()); 

.... 
nextButton.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) 
       {   
       notTriedPasswordsList.remove(0); 

         if(notTriedPasswordsList.size() > 0 && !(notTriedPasswordsList.get(0).getTried())) 
         { 
          nextCodeDisplay.setText(notTriedPasswordsList.get(0).getPasswordString()); 
         } 
        } 
+0

Come sono i tuoi progressi? Ho notato che non hai risposto di recente. –

+0

usa l'interfaccia per la comunicazione tra due frammenti, funzionerà in questo modo ..... – TheGreat004

risposta

1

La chiamata al PagerActivity.viewPagerAdapter.refresh(); non causerà il vostro frammento di essere ridisegnato. Invece dovresti accedere direttamente al tuo frammento e creare un metodo personalizzato refreshUI() al suo interno.

public void refreshUI(){ 
    nextCodeDisplay.setText(notTriedPasswordsList.get(0).getPasswordString()); 
} 
+0

cosa intendi? – BVtp

+0

puoi persino chiamare chiaro su un adattatore? Ricevo un errore .. 'il metodo getAdapter() non è definito per il tipo ...' – BVtp

+0

Cosa sono mainList e historyList (ListView? ArrayList?)? Cosa intendi per resettare i dati? cancellare solo la lista o cancellare e riempire con gli articoli predefiniti? – user2641570

2

PagerActivity viene trattato come una classe statica, e si può accedere solo metodi statici e dati dei membri e gli oggetti in questo modo. Codice in materia di:

notTriedPasswordsList = PagerActivity.mainList; 

Nota: Così ora PagerActivity possono accedere statica mainList oggetto, o notTriedPasswordsList (che condividono la stessa memoria). Ma questo è l'unico oggetto a cui puoi accedere dal momento che il tuo codice fa riferimento a metodi statici.

Sul codice PagerActivity.viewPagerAdapter.refresh(), non sono chiaro su quali dati vengono aggiornati poiché non vedo il codice sufficiente, di nuovo refresh() deve essere un metodo statico. Con il codice notifyDataSetChanged(), deve esistere un collegamento diretto tra viewPagerAdapter e l'oggetto dati, probabilmente un ArrayList . Certamente non vedo alcuna relazione diretta tra i due.

Forse si vuole un codice simile:

viewPagerAdapter pagerAdapter = new viewPagerAdapter(); 

In questo modo si può avere la relazione tra l'adattatore e, eventualmente, un oggetto ArrayList. Il vantaggio di creare un'istanza con nuovo è che salva i dati e lo stato all'interno della classe sotto forma di oggetto, nel mio esempio che è pagerAdapter.

Per il momento non riesco a suggerire un set di codici specifico poiché non ne vedo una quantità sufficiente da risolvere. Forse puoi prima sistemare il codice e poi tutti possiamo contribuire.

+0

@BVtp, Per maggiore chiarezza, penso che dovresti pubblicare più codice relativo all'adapter. –

1

Suggerisco di cambiare approccio. Ho caricato un semplice progetto sul mio dropbox public folder. Qui puoi trovare un'implementazione di riferimento di come due frammenti gestiti da un ViewPager possono condividere informazioni. Il primo frammento - Frammento n. 1 - mostra semplicemente una stringa generata da Framment # 2. Il frammento # 2 ha un pulsante che, quando viene cliccato, invia una stringa casuale al frammento # 1 attraverso l'attività. Non c'è bisogno di aggiornare viewpager, non c'è bisogno di metodi statici, semplici e funzionanti. Immagino che tu possa adattare questo esempio alle tue esigenze.

0

Come hai detto che vuoi aggiornare i tuoi dati, personalmente vorrei suggerire di utilizzare il layout di aggiornamento.Sarà molto utile per questo scopo ed elegante pure. Di seguito è riportato il codice.

Swipe_Refresh_layout.xml

<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/swipe_container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 





     <ListView android:id="@+id/listview" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:clickable="true" 
      /> 

</android.support.v4.widget.SwipeRefreshLayout> 

E seguendo è l'attività che sto usando per questo layout.

public class LatestNewsFragment extends Fragment implements OnRefreshListener ,OnScrollListener{ 


    SwipeRefreshLayout swipeLayout; 



    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
    { 

     = 
     View rootView = inflater.inflate(R.layout.Swipe_Refresh_layout, container, false); 

     swipeLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipe_container); 
     swipeLayout.setOnRefreshListener(this); 
     swipeLayout.setColorScheme(android.R.color.holo_blue_bright, 
       android.R.color.holo_green_light, 
       android.R.color.holo_orange_light, 

       android.R.color.holo_red_light); 

     return rootView; 
    } 

    public void onRefresh() { 
     new Handler().postDelayed(new Runnable() { 
      @Override public void run() { 
       swipeLayout.setRefreshing(false); 

       additemstatus(); 
      } 
     }, 5000); 
    } 

Ora nel metodo di aggiornamento sovrascritto è possibile aggiornare o caricare i dati. Spero che questo sarà molto utile per il vostro supporto.

Problemi correlati