Android如何从ListView元素打开片段

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元素,打开片段的最佳方法是什么?

TmC*_*afz 4

#更新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)