将Json对象从ViewHolder传递到片段

时间:2016-02-08 11:49:46

标签: java android json android-fragments

我有RecyclerViewFragment。我想将JSONObjectRecyclerView传递给Fragment。所以,我创建了一个接口,并在FragmentRecyclerView上实现了它。我初始化了变量并访问了将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;
                }
            }
        });

4 个答案:

答案 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。谢谢所有