-5

I want to parse two view in one recyclerview but i get the issue while parsing json data, while parsing i am confused about how to parse tow bean class using parent bean class. my code is below MainFragment.

public class SensorFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
private final String TAG = "MainActivity";
private RecyclerView recyclerView;
private LinearLayoutManager layoutManager;
private SensorAdapter adapter;
private OnFragmentInteractionListener mListener;
List<SensorResposne> sensorResposnes;
List<TemperatorSensorList> temperatorSensorLists;

public SensorFragment() {
    // Required empty public constructor
}

/**
 * Use this factory method to create a new instance of
 * this fragment using the provided parameters.
 *
 * @param param1 Parameter 1.
 * @param param2 Parameter 2.
 * @return A new instance of fragment SensorFragment.
 */
// TODO: Rename and change types and number of parameters
public static SensorFragment newInstance(String param1, String param2) {
    SensorFragment fragment = new SensorFragment();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    //return inflater.inflate(R.layout.fragment_fragment_three, container, false);
    View view = inflater.inflate(R.layout.fragment_sensor, container, false);
    recyclerView = view.findViewById(R.id.recyclerViewSensor);
    // recyclerView.addItemDecoration(new SimpleDividerItemDecoration(this));
    temperatorSensorLists = new ArrayList<>();
    sensorResposnes = new ArrayList<SensorResposne>();
    layoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(layoutManager);
    adapter = new SensorAdapter(getActivity(), sensorResposnes, true, true);
    recyclerView.setAdapter(adapter);
    requestJsonObject();
    return view;
}

private void requestJsonObject() {
    RequestQueue queue = Volley.newRequestQueue(getActivity());
    String potentialId = SitesUtil.getInstance().getSelectedPotentialId();
    String sensorUrl = UrlUtility.getSensorUrl(potentialId);

    StringRequest stringRequest = new StringRequest(Request.Method.GET, sensorUrl, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {


            Log.d(TAG, "Response " + response);
            Gson gson = new Gson();
            SensorResposne sensorResposne = gson.fromJson(response, SensorResposne.class);
            for (SensorList data : sensorResposne.getSensorList()) {
                if (data != null) {
                    data.getName();
                    data.getStatus();
                    sensorResposnes.add(data);
                }
            }
            for (TemperatorSensorList data : sensorResposne.getTemperatorSensorList()) {
                if (data != null) {
                    data.getSensorName();
                    // data.getTemperatureValue();
                    temperatorSensorLists.add(data);
                }
            }

            adapter = new SensorAdapter(getActivity(), sensorResposnes, true, true);
            recyclerView.setAdapter(adapter);
            Log.d("recycleviewResposne:", "resposne");


        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.d(TAG, "Error " + error.getMessage());
        }
    });

    queue.add(stringRequest);
}

// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
    if (mListener != null) {
        mListener.onFragmentInteraction(uri);
    }
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnFragmentInteractionListener) {
        mListener = (OnFragmentInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}


public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    void onFragmentInteraction(Uri uri);
}}

And Adpater for parsing Json Data:

public class SensorAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private boolean isHeader;
private boolean isFooter;
private List<SensorResposne> data;
private Context context;
public static final int VIEW_HEADER = 0;
public static final int VIEW_FOOTER = 2;
public static final int VIEW_ITEM = 1;

public SensorAdapter(Context context, List<SensorResposne> data, boolean isHeader, boolean isFooter) {
    this.context = context;
    this.data = data;
    this.isHeader = isHeader;
    this.isFooter = isFooter;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    if (viewType == VIEW_HEADER) {
        return new RecyclerViewHolders(LayoutInflater.from(context).inflate(R.layout.sensor_layout, parent, false));
    } else {
        return new Temperature(LayoutInflater.from(context).inflate(R.layout.temperature_list, parent, false));
    }
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

    if (holder instanceof RecyclerViewHolders) {
        ((RecyclerViewHolders) holder).textSensor.setText(data.get(position).getSensorList().get(position).getName());
        if (data.get(position).getSensorList().get(position).getStatus().equals("OK")) {
            ((RecyclerViewHolders) holder).mImageConnected.setImageResource(R.drawable.ic_connection_stauts);
        } else {
            ((RecyclerViewHolders) holder).mImageConnected.setImageResource(R.drawable.ic_notconnetced);
        }
       /* ((RecyclerViewHolders) holder).textSensor.setText(data.get(position).getName());
        if (data.get(position).getStatus().equals("OK"))
        {
            ((RecyclerViewHolders)holder). mImageConnected.setImageResource(R.drawable.ic_connection_stauts);
        }else
        {
            ((RecyclerViewHolders)holder). mImageConnected.setImageResource(R.drawable.ic_notconnetced);
        }*/
        Log.d("Item View", "Binding Item header at" + position);
    } else if (holder instanceof Temperature) {
        ((Temperature) holder).tvTemrature.setText(data.get(position).getTemperatorSensorList().get(position).getSensorName());
    }

}

// to Check the number of item
@Override
public int getItemCount() {
    int itemCount = data.size();
    //if header is required then increase the number of count by one
    if (isHeader) {
        itemCount = itemCount + 1;
    }
    if (isFooter) {
        itemCount = itemCount + 1;
    }
    return itemCount;
}
public SensorResposne getName(int position) {
    if (isHeader) {
        return data.get(position - 1);
    } else return data.get(position);
}
@Override
public int getItemViewType(int position) {

    if (isHeader && isHeader(position))
        return VIEW_HEADER;
    else if (isFooter && isFooter(position)) {
        return VIEW_FOOTER;
    } else return VIEW_ITEM;
}
private boolean isFooter(int position) {
    return position == getItemCount() - 1;
}

private boolean isHeader(int position) {
    //Check the position of item if item at position 0 then return true else false
    return position == 0;
}

public class RecyclerViewHolders extends RecyclerView.ViewHolder implements View.OnClickListener {
    TextView textSensor;
    ImageView mImageConnected;

    public RecyclerViewHolders(View itemView) {
        super(itemView);
        itemView.setOnClickListener(this);
        textSensor = (TextView) itemView.findViewById(R.id.textSensor);
        mImageConnected = itemView.findViewById(R.id.imageConnect);


    }

    @Override
    public void onClick(View view) {
    }
}
public class Temperature extends RecyclerView.ViewHolder implements View.OnClickListener {
    TextView tvTemrature, tvValue;

    public Temperature(View itemView) {

        super(itemView);
        itemView.setOnClickListener(this);
        tvTemrature = itemView.findViewById(R.id.sensorName);
        tvValue = itemView.findViewById(R.id.tvTempValue);
    }

    @Override
    public void onClick(View v) 
    {

    }
}

}

I have parent class called sensor resposne based on that class i want to parse tow baen class getter and setter method but am coufused on that my parent bean class is:

public class SensorResposne {
@SerializedName("sensorList")
@Expose
private List<SensorList> sensorList = null;
@SerializedName("temperatorSensorList")
@Expose
private List<TemperatorSensorList> temperatorSensorList = null;


public List<SensorList> getSensorList() {
    return sensorList;
}

public void setSensorList(List<SensorList> sensorList) {
    this.sensorList = sensorList;
}

public List<TemperatorSensorList> getTemperatorSensorList() {
    return temperatorSensorList;
}

public void setTemperatorSensorList(List<TemperatorSensorList> temperatorSensorList) {
    this.temperatorSensorList = temperatorSensorList;
}}

Am not able to figure out how to parse these tow beans class in single adapter using for multiple view in recyclerview any help

Subhash Pandey
  • 111
  • 1
  • 6

3 Answers3

2

Replace this

 for (SensorResposne data:sensorResposne.getSensorList())
            {

                data.getSensorList().get(0).getName();<-----"null potion exception"
                data.getSensorList().get(0).getStatus();

                posts.add(data);
                adapter=new SensorAdapter(getContext(),posts);
                recyclerView.setAdapter(adapter);
            }

to

for (int i=0; i< sensorResposne.getSensorList().size();i++ ){

  sensorResposne.getSensorList().get(i).getName();
                sensorResposne.getSensorList().get(i).getStatus();

                posts.add(sensorResposne.getSensorList());
                adapter=new SensorAdapter(getContext(),posts);
                recyclerView.setAdapter(adapter);
}
Thakur
  • 99
  • 1
  • 3
Harish Rawal
  • 226
  • 2
  • 15
0

As i see your code, this is necessary to put null handling to do such kind of operations please follow below code:

StringRequest stringRequest = new StringRequest(Request.Method.GET, sensorUrl, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {



            Log.d(TAG, "Response " + response);
            List<SensorResposne> posts = new ArrayList<>();
            Gson gson=new Gson();
           SensorResposne sensorResposne=gson.fromJson(response,SensorResposne.class);
           if(sensorResposne.size()>0){
            for (SensorResposne data:sensorResposne.getSensorList())
            {
            if(data.size()>0 && data.getSensorList()!=null){

                data.getSensorList().get(0).getName();<-----"null potion exception"
                data.getSensorList().get(0).getStatus();

                posts.add(data);
                adapter=new SensorAdapter(getContext(),posts);
                recyclerView.setAdapter(adapter);
            }
            }

         }

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.d(TAG, "Error " + error.getMessage());
        }
    });

    queue.add(stringRequest);  

I hope your problem will be solve also put null handling from your side as per your requirement. Thanks.

singh.indolia
  • 1,292
  • 13
  • 26
0

It kooks like your bean class is wrong. You are calling getSensorList() in SensorResposne object which is wrong. As per your Json string there is no array inside sensorList item. There are Jsonobjects no Jsonarray .These objects are name ,status ,lastTriggerTime ,lastTriggerToCurrentTime , lastTriggeredState ,sensorHealth ,hbCheck. No JsonArray is here

"sensorList": [
{
    "name": "PIR_Front_wall",
    "status": "OK",
    "lastTriggerTime": 0,
    "lastTriggerToCurrentTime": 0,
    "lastTriggeredState": false,
    "sensorHealth": false,
    "hbCheck": false
**No JsonArray is here** 
}] 

for (SensorResposne data:sensorResposne.getSensorList())
 {
data.getSensorList().get(0).getName();//Issue is here  .you already data is one of the SensorResposne object from  getSensorList() then why are you again looking for   getSensorList() again 
data.getSensorList().get(0).getStatus();
        }

Update your code like this

for (SensorList data:sensorResposne.getSensorList())
        { 
        if(data!=null){
            data..getName();
            data.getStatus();
         }
        }

Update Your SensorList class should not extend sensorResposneclass. This is where you are going wrong

public class SensorList extends TemperatorSensorList{
public String name;
public String status;
public int lastTriggerTime;
public int lastTriggerToCurrentTime;
public boolean lastTriggeredState;
public boolean sensorHealth;
public boolean hbCheck;
public boolean isTempSensor;//need to set  true if it is temp. So that you can differentiat betweet two list sensorList and tempList.
  }

  public class SensorResposne {
  @SerializedName("sensorList")
  @Expose
  private List<SensorList> sensorList = null;
  @SerializedName("temperatorSensorList")
  @Expose
  private List<SensorList> temperatorSensorList = null;

 for (SensorList data:sensorResposne.getTemperatorSensorList())
    { 
    if(data!=null){
        data.getName();
        data.getStatus();
        data.isTempSensor=true;//add this data to your common list.
     }
    }
Shakeeb Ayaz
  • 6,200
  • 6
  • 45
  • 64