我有两个片段,一个是对象的listview,另一个是对象的详细信息。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吗?
发布于 2013-08-15 04:32:32
我通过在片段中实现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);就是这样!
发布于 2014-07-22 22:44:33
您已经在适配器的构造函数中通过getActivity传输了FragmentActivity实例。
您可以使用它来获取片段管理器。通过
FragmentActivity mActivity;
public xyz(FragmentActivity a,args)
{
this.mActivity = a;
}
和onClickListener
mActivity.getFragmentManager().beginTransaction();
你可以做你想做的事。
https://stackoverflow.com/questions/18229460
复制相似问题