如何将Fragment传递给CustomArrayAdapter构造函数

时间:2016-06-02 19:58:05

标签: java android

我有一个MainActivity,它有一个名为myFragment的片段。我使用ViewPagerAdapter调用Fragment,它工作正常。

我正在尝试将MyFragment传递给CustomArrayAdapter,但我的应用程序在调用超类时会在构造函数中崩溃。

这是我的代码:

MyFragment.java

public class MyFragment extends Fragment implements MyInterface {

    public MyFragment() {}

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_paired_device, container, false);
    }

    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Row[] arrList = new Row[5];

        // THE FOLLOWING LINE IS SUPPOSED TO PASS THE FRAGMENT
        CustomAdapter myCustomAdapter = new CustomAdapter((MyInterface) this.getActivity(), arrList);
    }
}

CustomAdapter.java

public class CustomAdapter extends ArrayAdapter<Row> {
    Row[] rowItems = null;
    MyInterface myFragment;

    public CustomAdapter(MyInterface myFragment, Row[] resource) {
        // THE FOLLOWING LINE THROWS AN ERROR
        super((FragmentActivity) myFragment, R.layout.row_with_cb, resource);
        this.rowItems = resource;
        this.myFragment = myFragment;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
    }
}

我收到以下错误:

java.lang.ClassCastException: MainActivity cannot be cast to MyInterface

出于某种原因,this.getActivity应该发送FragmentActivity但它发送MainActivity。

任何人都可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

  

我正在尝试将MyFragment传递给CustomArrayAdapter,但是我的   应用程序在调用超类时在构造函数中崩溃。

您目前正在尝试传递Activity附加的MyFragment,而不是Fragment本身:

CustomAdapter myCustomAdapter = new CustomAdapter((MyInterface) this.getActivity(), arrList);

您收到ClassCastException的原因是因为您试图&#34;施放&#34; Activity方法调用(在本例中为getActivity())返回的MainActivity(MyInterface)。由于MainActivity未实现MyInterface,因此会导致异常。

实际上不清楚你想要实现的目标。正如Eugen在他的回答中指出的那样,默认的ArrayAdapter构造函数采用Context参数。 MyInterfaceMyFragment都不是Context的示例。但是,Activity Context。所以下面的超级电话没有意义:

public CustomAdapter(MyInterface myFragment, Row[] resource) {
    super((FragmentActivity) myFragment, R.layout.row_with_cb, resource);
}

因此,您应该将Activity传递给此处。如果您仍想传递Interface,那么您可以将构造函数调整为:

private MyInterface myInterface;    

public CustomAdapter(Context context, Row[] rows, MyInterface myInterface){
    super(context, R.layout.row_with_cb, rows);
    this.myInterface = myInterface;
}

我不确定您是否确实想要从您的问题中将FragmentMyInterface传递给适配器。

答案 1 :(得分:0)

数组适配器只需要上下文(不是片段)。

将其更改为下一个:

public CustomAdapter(Context context, Row[] resource) {
        super(context, R.layout.row_with_cb, resource);
        ...
}   

删除活动:

CustomAdapter myCustomAdapter = new CustomAdapter(this.getActivity(), arrList);

答案 2 :(得分:0)

我想要实现的方案比问题本身复杂一点。

我通过将this和this.getContext()传递给CustomAdapter构造函数来修复它。正如Shayan和PPartisan所提到的,只需要一个Context就可以发送到ArrayAdapter构造函数。

从Fragment的角度来看,this.getActivity()预计会产生当前片段的片段活动&#39; (不确定它是否应该是MainActivity),这是CustomAdapter超级类的有效参数,但它没有返回(我仍然不确定为什么会发生这种情况)。这就是我试图进行演员表的原因。

我需要片段本身的原因是因为,我有一个回调方法(在CustomAdapter中),它调用myInterface声明的方法并由Fragment实现。

目前,一切都很顺利。

由于