2013-08-14 3 views
0

J'ai deux fragments, un avec listview des objets et d'autres pour les détails de l'objet. Listview est peuplé par BaseAdapter et j'essaie de passer à un autre fragment (détails de l'objet) de listview onclick. Le code que je travaille bien avant avec les activités:FragmentTransaction à partir de BaseAdapter

public class MyAdapter extends BaseAdapter { 

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

    public MyAdapter(Activity actt, ArrayList<HashMap<String, String>> d) { 
     activity = actt; 
     data=d; 
     inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     imageLoader=new ImageLoader(activity.getApplicationContext()); 
     mDataShown= (ArrayList<HashMap<String, String>>) d; 
     mAllData = (ArrayList<HashMap<String, String>>) mDataShown.clone(); 
    } 

    public int getCount() { 
     return mDataShown.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.songs_row, null); 

     TextView tvsong = (TextView)vi.findViewById(R.id.tvSong); 
     TextView tvsinger = (TextView)vi.findViewById(R.id.tvSinger); 

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

     final Context ct; 
     ct = vi.getContext(); 

     final String stsong = song.get(Songs.KEY_NAME); 
     final String stsinger = song.get(Songs.KEY_SINGER); 

     tvsong.setText(stsong); 
     tvsinger.setText(stsinger); 

     vi.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       Intent i = new Intent(ct, SongDetails.class);    
       Bundle bandl = new Bundle(); 
       bandl.putString("song", stsong); 
       bandl.putString("singer", stsinger); 
       i.putExtras(bandl); 
       ct.startActivity(i); 
      } 
     }); 

     return vi; 
    } 

Mais maintenant, je change des activités avec des fragments et je dois remplacer l'activité fragment de départ à la place. Essayé avec ce code

vi.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      Fragment SongDetailsFragment = SongDetails.newInstance(); 
      FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); 
      transaction.addToBackStack(null); 
      transaction.replace(R.id.SongContainer, SongDetailsFragment); 
      transaction.commit(); 
     } 
    }); 

mais cela ne fonctionnera pas. Est-ce que quelqu'un a une idée de comment utiliser FragmentTransaction de BaseAdapter?

+0

cela pourrait aider: http://stackoverflow.com/questions/14354885/android-fragments-backstack – ASP

Répondre

2

Je résolu ce problème en la mise en œuvre setOnItemClickListener dans Fragment:

songList = new ArrayList<HashMap<String, String>>(); 
. 
. 
. 
adapter = new MyAdapter(getActivity(), songList); 
list.setAdapter(adapter); 
list.setOnItemClickListener(new OnItemClickListener() { 


public void onItemClick(AdapterView<?> adapter, View view, int position, long id) { 

        HashMap<String, String> o = (HashMap<String, String>) list.getItemAtPosition(position); 

        Bundle bundle = new Bundle(); 
        bundle.putString("song", o.get("song")); 
        bundle.putString("singer", o.get("singer")); 

        Fragment SongDetailsFragment = SongDetails.newInstance(); 
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); 
        SongDetailsFragment .setArguments(bundle); 
        transaction.addToBackStack(null); 
        transaction.replace(R.id.SongContainer, SongDetailsFragment); 
        transaction.commit(); 
       } 
       }); 

En outre, un petit changement dans le code BaseAdapter:

Remplacer:

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

avec:

public Object getItem(int position) { 
    return data.get(position); 

Et c'est tout!

+0

Dans cette ligne Fragment SongDetailsFragment = SongDetails.newInstance(); Qu'est-ce que SongDetails? –

0

Vous avez transféré l'instance FragmentActivity via getActivity dans le constructeur de l'adaptateur.

vous pouvez l'utiliser pour obtenir le gestionnaire de fragments. par

FragmentActivity mActivity;

xyz publique (FragmentActivity a, args)

{

this.mActivity = a; 

}

et

onClickListener

mActivity.getFragmentManager() beginTransaction().

Et vous pouvez faire ce que vous voulez.