我有一个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。
任何人都可以帮我解决这个问题吗?
答案 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
参数。 MyInterface
和MyFragment
都不是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;
}
我不确定您是否确实想要从您的问题中将Fragment
或MyInterface
传递给适配器。
答案 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实现。
目前,一切都很顺利。
由于