【问题标题】:FragmentTransaction from BaseAdapter来自 BaseAdapter 的 FragmentTransaction
【发布时间】:2013-08-14 10:36:56
【问题描述】:

我有两个片段,一个是对象列表视图,另一个是对象详细信息。 Listview 由 BaseAdapter 填充,我正在尝试从 listview onclick 切换到其他片段(对象详细信息)。我之前在活动中运行良好的代码:

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

但是现在我用片段更改了活动,我需要替换片段而不是开始活动。尝试使用此代码

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

但它不会工作。有谁知道如何使用 BaseAdapter 中的 FragmentTransaction?

【问题讨论】:

    标签: android android-listview android-fragments baseadapter


    【解决方案1】:

    我通过在 Fragment 中实现 setOnItemClickListener 解决了这个问题:

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

    另外,BaseAdapter 代码的小改动:

    替换:

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

    与:

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

    就是这样!

    【讨论】:

    • 在这一行 Fragment SongDetailsFragment = SongDetails.newInstance();什么是 SongDetails?
    【解决方案2】:

    您已经通过适配器的构造函数中的getActivity传递了FragmentActivity实例。

    您可以使用它来获取片段管理器。 由

    FragmentActivity mActivity;

    公共 xyz(FragmentActivity a, args)

    {

      this.mActivity = a;
    

    }

    和 onClickListener

    mActivity.getFragmentManager().beginTransaction();

    你可以为所欲为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 2014-09-22
      相关资源
      最近更新 更多