我必须在MainActivity中实现一个接口,该接口在自定义适配器中定义。但是该接口方法的所有相关对象都在片段中定义。那么我如何在MainActivity和片段之间进行通信,以使接口的实现工作而不会得到空指针异常?
这是我必须实现的接口,它是在自定义适配器中定义的。
public interface UpdateMainClass{
void updateItemList(int position);
void updateListBackground(int position, boolean isChecked);
}
在我的主要活动中,我重写了上述内容。
/**
* <p>This method is used to remove the item from speicified position</p>
* @param position location of the item to be removed
*/
@Override
public void updateItemList(int position) {
myNewFragment.updateItemList(position);
}
/**
* <p>Updates the background checkbox status in POJO class and helps to set the background color on long press.</p>
* <p>Illegal state is checked to prevent changing of checkbox status while list is being scrolled.</p>
* @param position position of the item in list where checkbox status is changed.
* @param isChecked current status of the checkbox.
*/
@Override
public void updateListBackground(int position, boolean isChecked) {
myNewFragment.updateListBackground(position, isChecked);
}
这是我的Fragment类,我可以实际实现该方法。
/**
* <p>This method is used to remove the item from speicified position</p>
*
* @param position location of the item to be removed
*/
public void updateItemList(int position) {
myArrayList.remove(position);
mAdapter.notifyItemRemoved(position);
}
/**
* <p>Updates the background checkbox status in POJO class and helps to set the background color on long press.</p>
* <p>Illegal state is checked to prevent changing of checkbox status while list is being scrolled.</p>
*
* @param position position of the item in list where checkbox status is changed.
* @param isChecked current status of the checkbox.
*/
public void updateListBackground(int position, boolean isChecked) {
try {
if (isChecked)
myArrayList.get(position).setCompleted(1);
else
myArrayList.get(position).setCompleted(0);
mAdapter.notifyItemChanged(position);
} catch (IllegalStateException e) {
//do nothing
}
}
这显然不起作用,我最终在我的片段类中的myArrayList.get(position)
得到一个空指针异常。那么有更好的方法来编码吗?
答案 0 :(得分:0)
不会那样。
首先,创建一个接口,该接口具有用于在片段和主机活动之间进行通信的方法。
其次,您在主机活动中实现该接口并执行业务逻辑。
第三,你在片段的onAttach()方法中获得了你的活动的回调:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
callback = (UpdateMainClass) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement UpdateMainClass");
}
}
Forth,您可以通过activity的回调字段从您的片段调用这些接口方法,如:
callback.updateItemList(_data_);
这是Fragment -> Activity communication。
如果要从主机活动访问片段的方法,您应该从FragmentManager中获取片段的引用。
最好的解决方案是使用EventBus库,如Otto,EventBus或RxBus。