首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自BaseAdapter的FragmentTransaction

来自BaseAdapter的FragmentTransaction
EN

Stack Overflow用户
提问于 2013-08-14 18:36:57
回答 2查看 3.3K关注 0票数 0

我有两个片段,一个是对象的listview,另一个是对象的详细信息。Listview由BaseAdapter填充,我正在尝试从listview onclick切换到其他片段(对象详细信息)。我以前在活动中工作得很好的代码:

代码语言:javascript
复制
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;
    }

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

代码语言:javascript
复制
    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吗?

EN

回答 2

Stack Overflow用户

发布于 2013-08-15 04:32:32

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

代码语言:javascript
复制
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代码中的小更改:

替换:

代码语言:javascript
复制
public Object getItem(int position) {
    return (position);

通过以下方式:

代码语言:javascript
复制
public Object getItem(int position) {
    return data.get(position);

就是这样!

票数 2
EN

Stack Overflow用户

发布于 2014-07-22 22:44:33

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

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

FragmentActivity mActivity;

public xyz(FragmentActivity a,args)

{

this.mActivity = a;

}

和onClickListener

mActivity.getFragmentManager().beginTransaction();

你可以做你想做的事。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18229460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档