0

I have two fragments, one with listview of objects and other for object details. Listview is populated by BaseAdapter and I`m trying to switch to other fragment (object details) from listview onclick. The code that I have worked fine before with activities:

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;
    }

But now I changed activities with fragments and I need to replace fragment instead starting activity. Tried with this 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();
        }
    });

but it wont work. Does anyone have an idea how to use FragmentTransaction from BaseAdapter?

Stole51
  • 69
  • 1
  • 8

2 Answers2

2

I solved this by implementing setOnItemClickListener in 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();
                }
              });  

Also, small change in BaseAdapter code:

Replace:

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

with:

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

And thats it!

Stole51
  • 69
  • 1
  • 8
0

You have trasfer the FragmentActivity instance through getActivity in constructor of adapter.

you can use this to get the fragment manager. by

FragmentActivity mActivity;

public xyz(FragmentActivity a, args)

{

  this.mActivity = a;

}

and onClickListener

mActivity.getFragmentManager().beginTransaction();

And you can do what you want .

Community
  • 1
  • 1
shailesh
  • 1,783
  • 2
  • 17
  • 26