2013-08-26 18 views
5

OK, quindi ho una lista (che è anche una finestra di dialogo dei frammenti) che visualizza gli amici di un utente e ogni elemento in quell'elenco ha un pulsante (etichettati gli amici nella foto) e quando gli utenti fanno clic su quell'id del pulsante per visualizzare un'altra finestra di dialogo che mostra tutte le opzioni per interagire con quell'utente (richiesta di amicizia, blocco, invio di messaggi privati ​​ecc ...) il problema è che questo pulsante e il listener onClick è attualmente implementato tramite l'override del mio metodo listView per gli adattatori listview e per creare un frammentDialog richiede l'accesso al gestore dei frammenti. C'è un modo per farlo funzionare?Avvia un frammento di finestra di dialogo sul pulsante clic da un adattatore di base personalizzato> getView [IMG INCLUSO]

MODIFICA: Non posso inviare il codice effettivo dal progetto, ma sono collegato a un adattatore di base semplificato w. onClickListener che dovrebbe chiarire cosa sto cercando di fare. Non riesco ad accedere al fragmentManager da una classe di adattatori di base per rendere la finestra frammento possibile

LazyAdapter.java 
package com.example.androidhive; 

import java.util.ArrayList; 
import java.util.HashMap; 

import android.app.Activity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class LazyAdapter extends BaseAdapter { 

    private Activity activity; 
    private ArrayList<HashMap<String, String>> data; 
    private static LayoutInflater inflater=null; 
    public ImageLoader imageLoader; 

    public LazyAdapter(Activity a, ArrayList<HashMap<String, String>> d) { 
     activity = a; 
     data=d; 
     inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     imageLoader=new ImageLoader(activity.getApplicationContext()); 
    } 

    public int getCount() { 
     return data.size(); 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     View vi=convertView; 
     if(convertView==null) 
      vi = inflater.inflate(R.layout.list_row, null); 
     Button requestBtn = (Button)vi.findViewById(R.id.title); // title 

     HashMap<String, String> song = new HashMap<String, String>(); 
     song = data.get(position); 

     // Setting all values in listview 
     title.setText(song.get(CustomizedListView.KEY_TITLE)); 
     artist.setText(song.get(CustomizedListView.KEY_ARTIST)); 
     duration.setText(song.get(CustomizedListView.KEY_DURATION)); 
     imageLoader.DisplayImage(song.get(CustomizedListView.KEY_THUMB_URL), thumb_image); 

     requestBtn.setOnClickListener(new myOnClickListener(position)); 
     return vi; 
    } 

     public class myOnClickListener implements OnClickListener{ 
    private int position; 
    private String clicked_uid; 
    public myOnClickListener(int position){ 
     this.position=position; 
    } 
    @Override 
    public void onClick(View v) { 


    //THIS IS WHERE IM TRYING TO PUT THE FRAGMENT DIALOG 

     FragmentManager fm = TabHostFragmentActivity.this.getSupportFragmentManager(); 
     FriendsFamiliarsDialog friendsDialog = new FriendsFamiliarsDialog().newInstance(TabHostFragmentActivity.profile_uid,"friends"); 
     friendsDialog.show(fm, "friendsdialog"); 





    } 

    } 
} 

listview fragment dialog getView android

+1

Puoi postare qualche codice rilevante – TronicZomB

+0

Pubblica il tuo codice classe adattatore. – GrIsHu

+1

L'avvio di 'DialogFragment's in un' DialogFragment' suona disordinato. Invece di usare 'DialogFragment's, usa' Activity's a tema di dialogo. –

risposta

0

Quando si crea LazyAdapter passa nella visualizzazione per la quale è stato creato adattatore o il frammento di un genitore o di attività, e poi nel metodo onclick usa questo per chiamare una funzione sul tuo frammento o attività per mostrare il frammento della finestra di dialogo, ricorda che dalla classe dell'adattatore dovresti solo inviare messaggi attraverso chiamate di funzione ai componenti dell'interfaccia utente per fare qualcosa di interessante come mostrare frammenti di dialogo

+0

nel mio attuale adattatore di base faccio passare nel contesto, ma il contesto da solo non può essere utilizzato per accedere a un gestore di frammenti per qualche motivo, puoi pubblicare un esempio di tua soluzione? Penso che ull troverà lo stesso problema di me – ChuckKelly

+0

Invece di passare nel contesto, passa la tua attività. diciamo che l'ID della classe TestActivity lo trasmette al costruttore della classe dell'adattatore. e all'interno del metodo onclick eseguire mTestActivity.ShowDialogFragment (string data1, string data2); –

+0

L'ho capito circa 2 minuti dopo che ho risposto, ma l'ho fatto passando un gestore di frammenti nel mio costruttore di adattatori di base che ha funzionato .... c'è qualche vantaggio nel passare il frammento di finestra di dialogo nel costruttore invece del frammento manager? – ChuckKelly

12

I anche faticato ad accedere al Fragm Manager ent da un adattatore per visualizzare un DialogFragment. Ecco la soluzione nel codice:

public class YourPagerAdapter extends PagerAdapter{ 

    private Context context; 

    public YourPagerAdapter(Context c) { 
      this.context = c; 
    } 

    @Override 
     public void onClick(View v) { 
      FragmentActivity activity = (FragmentActivity)(context); 
      FragmentManager fm = activity.getSupportFragmentManager(); 
      YourDialogFragment alertDialog = new YourDialogFragment(); 
      alertDialog.show(fm, "fragment_alert"); 
     } 
} 

Il trucco è che si riceve l'attività come contesto e basta lanci per assicurarsi che sia un FragmentActivity - che è ciò che le esigenze del gestore. Questo funziona perché quando si chiama YourPagerAdapter nel file di livello superiore si passa l'attività al suo interno:

pagerAdapter = new YourPagerAdapter(getActivity()); 
yourViewPager.setAdapter(pagerAdapter); 
+0

Grazie per l'asnwer che ha risolto il mio problema – Sam

0

stavo cercando di aprire un dialogfragment da un pulsante che si trova in una lista personalizzata per un app che mostra un elenco di eventi . Ho risolto questo problema cambiando il mio costruttore di adattatori.

Nella mia classe adattatore:

public class EventAdapter extends BaseAdapter { 

private Context context; 
private ArrayList <Event> mEvents; 
private FragmentManager fm; 

public EventAdapter(Context context, ArrayList<Event> events, FragmentManager fm) { 
    this.context = context; 
    this.fm = fm; 
    mEvents = events; 
} 

poi sono stato in grado di fare questo:

 holder.saveButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      SignupFragment signupFragment = new SignupFragment(); 
      signupFragment.show(fm, "Sample Fragment"); 
      Log.i(TAG, "click on save button"); 
     } 
    }); 

E ho cambiato la mia chiamata adattatore nel mio più in alto di attività (AllEventsActivity):

FragmentManager fm = getFragmentManager(); 
    mAdapter = new EventAdapter(this, mEvents, fm); 
Problemi correlati