如何在recyclerview中的两个视图中解析多个json数据?

时间:2018-04-11 05:35:58

标签: java android android-recyclerview gson

我想在一个recyclerview中解析两个视图但是我在解析json数据时遇到了问题,而解析时我很困惑如何使用父bean类解析tow bean类。我的代码在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);
}}

用于解析Json数据的Adpater:

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) 
    {

    }
}

}

我有一个名为sensor resposne的父类,基于该类,我想解析两个类的getter和setter方法,但是我觉得我的父bean类是:

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;
}}

我无法弄清楚如何在单个适配器中解析这些tow bean类  在recyclerview中使用多视图任何帮助

3 个答案:

答案 0 :(得分:2)

替换此

 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);
            }

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);
}

答案 1 :(得分:0)

在我看到你的代码时,有必要将null处理用于执行此类操作,请遵循以下代码:

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);  

我希望您的问题能够得到解决,并根据您的要求从您的方面处理空值处理。感谢。

答案 2 :(得分:0)

就像你的bean类错了一样。您在getSensorList()对象中调用SensorResposne这是错误的。根据你的Json字符串,sensorList内没有数组 项目。有Jsonobjects没有Jsonarray。这些对象是namestatuslastTriggerTimelastTriggerToCurrentTimelastTriggeredStatesensorHealthhbCheck没有JsonArray在这里

"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();
        }

像这样更新您的代码

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

更新您的SensorList课程不应该延长sensorResposne课程。这是你出错的地方

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.
     }
    }