我想在一个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中使用多视图任何帮助
答案 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。这些对象是name
,status
,lastTriggerTime
,lastTriggerToCurrentTime
,lastTriggeredState
,sensorHealth
,hbCheck
。 没有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.
}
}