我有RecyclerView
和Fragment
。我想将JSONObject
从RecyclerView
传递给Fragment
。所以,我创建了一个接口,并在Fragment
和RecyclerView
上实现了它。我初始化了变量并访问了将JSONObject
传递给它的片段中的方法,但是在尝试访问该方法时我得到NPE
:
public class ProductResultsListFragment extends Fragment implements ProductResultAdapterInterface{
//code here
@Override
public void showResultsInMap(JSONObject mapObject)
{
openMapFragment(mapObject);
}
在我的RV课程中,我有以下内容:
public class ProductSearchAdapter extends RecyclerView.Adapter<ProductSearchAdapter.ViewHolder> {
public ProductResultAdapterInterface mProductResultsListener;
.....
if (mapObjects.length()>0)
{
mProductResultsListener.showResultsInMap(mapObjects);
}
if
语句位于我viewHolder
课程的RecyclerView
内,但该实例已公开。
我已经尝试过投射我的mProductResultsListener,但不知道要将它投射到哪个类中。
public ProductResultAdapterInterface mProductResultsListener=((ProductResultAdapterInterface ) ?????);
快速评论:mapObject(JsonObject)是在ViewHolder中按钮内的onClick方法上创建的,我无法在OnCreate方法上传递包。
this.btnMarkItemMap.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = getAdapterPosition();
switch (v.getId())
{
case (R.id.markProductinMap):
String mapObj=null;
if (mapObjects !=null)
{
String positionDescription=String.valueOf(position);
String productLatLngValue=txtProductPrice.getText().toString()+";"+ txtItemLanLong.getText().toString();
//tring mapPosition=
mapObj=mapObjects.optString(String.valueOf(position));
if (mapObj!="") //Button not click remove from map
{
btnMarkItemMap.setColorFilter(Color.rgb(0, 0, 0));
btnMarkItemMap.setTag(Color.rgb(0, 0, 0));
mapObjects.remove(positionDescription);
}
else //Button Click add to Map
//
{
btnMarkItemMap.setColorFilter(Color.rgb(255, 51, 102));
btnMarkItemMap.setTag(position);
try {mapObjects.put(positionDescription, productLatLngValue);}catch (JSONException ex){}
if (mapObjects.length()>0)
{
mProductResultsListener.showResultsInMap(mapObjects);
}
}
}else{
mapObjects=new JSONObject();
}
break;
}
}
});
答案 0 :(得分:0)
你在哪里分配了变量mProductResultsListener
?
你需要通过将它传递给适配器将其分配给片段的对象。否则,它的值为null,如果在空对象上调用函数,则会得到NullPointeException
。
如果有,请用该代码更新问题。
答案 1 :(得分:0)
您可以使用像这样的捆绑包传递数据
SomeFragment someFragment = new SomeFragment();
Bundle bundle = new Bundle();
bundle.putString("value1", "2");
bundle.putString("value2", "23");
bundle.putString("value3", "276");
bundle.putString("value4", "27");
bundle.putBoolean("flag", true);
someFragment.setArguments(bundle);
在SomeFragment中
Bundle bundle = getArguments();
strValue1 = bundle.getString("value1");
strValue2 = bundle.getString("value2");
等从bundle
获取所有传递的数据答案 2 :(得分:0)
ProductResultsListFragment yourFragment = new ProductResultsListFragment();
Bundle bundle = new Bundle();
bundle.putString("yourJsonObject", yourJsonObject.toString);
yourFragment.setArguments(bundle);
public class ProductResultsListFragment...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle savedInfo = this.getArguments();
String savedJsonString = savedInfo.getString("yourJsonObject");
JSONObject myJsonObject = new JSONObject(savedJsonString);
//....
答案 3 :(得分:0)
在我的Fragment适配器init上,我添加了:
ProductResultAdapterInterface mProInterface=(ProductResultAdapterInterface) this;
mAdapter = new ProductSearchAdapter(R.layout.product_results_cardlist,getActivity(),productListFeed,mProInterface);
在我的适配器构造函数上的我更改了签名以接受Interface作为从Fragment传递的参数
public ProductSearchAdapter (int rowLayout, Context context,List<Product> feedList,ProductResultAdapterInterface mProductResultsListener) {
this.feedItemLists=feedList;
this.rowLayout = rowLayout;
this.mContext = context;
this.mProductResultsListener=mProductResultsListener;
}
然后我能够访问该方法而不是获取NPE。谢谢所有