bar*_*rmi 6 android android-fragments
在其中MainActivity是FrameLayout MainContainer。我在其中加载一个片段TrainerMyGroups,在Listview中,我通过使用添加了一些元素(每个元素都有一些字符串)TrainerGroupsAdapter。实际上,我想通过单击列表的元素将片段替换TrainerMyGroups为另一个片段(例如TrainersInfo)。
我的TrainerGroupsAdapter是:
public class TrainerGroupsAdapter extends ArrayAdapter {
List list = new ArrayList();
public TrainerGroupsAdapter(Context context, int resource) {
super(context, resource);
}
static class Datahandler{
TextView name;
TextView when;
TextView where;
LinearLayout ll;
}
@Override
public void add(Object object) {
super.add(object);
list.add(object);
}
@Override
public int getCount() {
return this.list.size();
}
@Override
public Object getItem(int position) {
return this.list.get(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row;
row=convertView;
Datahandler handler;
SharedPreferences pref = getContext().getSharedPreferences("pref", Context.MODE_PRIVATE);
if(convertView==null){
LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row= inflater.inflate(R.layout.list_mygroups,parent,false);
handler = new Datahandler();
handler.name = (TextView) row.findViewById(R.id.trainermygroupslistname);
handler.where = (TextView) row.findViewById(R.id.trainermygroupslistwhere);
handler.when = (TextView) row.findViewById(R.id.trainermygroupslistwhen);
handler.ll=(LinearLayout) row.findViewById(R.id.trainermygroupslistlayout);
row.setTag(handler);
}
else {
handler = (Datahandler)row.getTag();
}
TrainerGroupsDataProvider dataProvider;
dataProvider = (TrainerGroupsDataProvider)this.getItem(position);
handler.name.setText(dataProvider.getName());
handler.when.setText(dataProvider.getWhen());
handler.where.setText(dataProvider.getWhere());
handler.ll.setBackgroundColor(Color.parseColor(pref.getString(TRANSP_KEY, "#CC") + dataProvider.getColor()));
handler.ll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getFragmentManager().beginTransaction().replace(R.id.MainContainer, new TrainerInfo()).addToBackStack(null).commit();
}
});
return row;
}
}
Run Code Online (Sandbox Code Playgroud)
它不起作用,但是OnClick方法可能很好,因为如果我替换getFragmentManager().beginTransaction().replace(R.id.MainContainer, new TrainerInfo()).addToBackStack(null).commit();代码以更改某些字符串(名称,在tc时),它将起作用。问题在getFragmentMenager(),Android Studio显示消息我必须创建Getter,AS的建议是在OnClick方法中生成:
private FragmentManager fragmentManager;
public FragmentManager getFragmentManager() {
return fragmentManager;
}
Run Code Online (Sandbox Code Playgroud)
然后问题出在中的第二个参数中replace,我有一个错误,那就是它必须是Fragment(我肯定TrainersInfo()是fragment,因为我在其他地方使用了它并且可以工作)。如何解决此问题,或者单击另一个片段中的lise元素,打开片段的最佳方法是什么?
#更新2
比替换适配器内的片段更好的是,您的活动应该替换该片段。这可以通过在 Activity 中实现的接口来完成:
public class TrainerGroupsAdapter extends ArrayAdapter {
// The interface which you have to implement in your activity
public interface OnChangeFragmentListener {
void changeFragment();
}
List list = new ArrayList();
private OnChangeFragmentListener m_onChangeFragmentListener;
public TrainerGroupsAdapter(Context context, int resource) {
super(context, resource);
m_onChangeFragmentListener = (OnChangeFragmentListener) context;
}
// Your other code
}
Run Code Online (Sandbox Code Playgroud)
getView 方法中的 OnClickListener:
handler.ll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Call the method which change the fragment
m_onChangeFragmentListener.changeFragment();
}
});
Run Code Online (Sandbox Code Playgroud)
活动:
public class MainActivity extends AppCompatActivity implements TrainerGroupsAdapter.OnChangeFragmentListener {
//...
// Your Other code
// Implement the method which is called in the adapter and replace the fragment here
@Override
public void changeFragment() {
getFragmentManager().beginTransaction().replace(R.id.MainContainer, new TrainerInfo()).addToBackStack(null).commit();
}
}
Run Code Online (Sandbox Code Playgroud)
#更新1
您需要 getSupportFragmentManager() 和 getFragmentManager() 的活动上下文。您可以将构造函数的 Context 参数更改为 Activity,并在类中为该活动创建一个成员变量,以便稍后使用它:
public class TrainerGroupsAdapter extends ArrayAdapter {
List list = new ArrayList();
private Activity m_activity;
public TrainerGroupsAdapter(Activity context, int resource) {
super(context, resource);
m_activity = context;
}
// Your other code
}
Run Code Online (Sandbox Code Playgroud)
getView 方法中的 OnClickListener:
handler.ll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
m_activity.getFragmentManager().beginTransaction().replace(R.id.MainContainer, new TrainerInfo()).addToBackStack(null).commit();
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3014 次 |
| 最近记录: |