Recyclerview json数据绑定失败

时间:2018-01-31 20:31:17

标签: android json android-recyclerview

我正在尝试将JSON数据绑定到recyclerView,但数据似乎没有绑定到RecyclerView。 令人惊讶的是,当我向数据敬酒时,我发现它可用。可能是什么问题?

 private void parseJson(String  result){

        try {
            if (result!=null) {
                String resultTostring = "" + result;
                JSONObject obj = new JSONObject(resultTostring).getJSONObject("ScheduleResource");
                JSONArray arr = obj.getJSONArray("Schedule");
                itemList = new ArrayList<>();
                for (int i = 0; i < arr.length(); i++)
                {
                    String DepartureAirport = arr.getJSONObject(i).getJSONObject("Flight").getJSONObject("Departure").getString("AirportCode");
                    String ArrivalAirport = arr.getJSONObject(i).getJSONObject("Flight").getJSONObject("Arrival").getString("AirportCode");
                    String Duration = arr.getJSONObject(i).getJSONObject("TotalJourney").getString("Duration");
                    String DepartureTime = arr.getJSONObject(i).getJSONObject("Flight").getJSONObject("Departure").getJSONObject("ScheduledTimeLocal").getString("DateTime");
                    String ArrivalTime = arr.getJSONObject(i).getJSONObject("Flight").getJSONObject("Arrival").getJSONObject("ScheduledTimeLocal").getString("DateTime");
                    String Stops = arr.getJSONObject(i).getJSONObject("Flight").getJSONObject("Details").getJSONObject("Stops").getString("StopQuantity");

                    FlightModel model = new FlightModel();
                    model.setDepartureAirport(DepartureAirport);
                    model.setArrivalAirport(ArrivalAirport);
                    model.setDuration(Duration);
                    model.setDeparturTimee(DepartureTime);
                    model.setArrivalTime(ArrivalTime);
                    model.setStops(Stops);
                    model.Stops= Stops;


                    itemList.add(model);



                    Toast.makeText(FlightListActivity.this, "DEPT : " + DepartureAirport + " Arrival " + ArrivalAirport+
                            " Duration : " + Duration + " Dept time : "+ DepartureTime+" Arr Time "+ ArrivalTime
                            +" Stops "+ Stops, Toast.LENGTH_LONG).show();



                }

                // Setup and Handover data to recyclerview

                final FlightAdapter adapter = new FlightAdapter(FlightListActivity.this, itemList);
                flights_rv.setAdapter(adapter);
                flights_rv.setLayoutManager(new LinearLayoutManager(FlightListActivity.this));
            }
            else{
                Toast.makeText(FlightListActivity.this,Config.POOR_NETWORK_CONNECTION, Toast.LENGTH_LONG).show();


            }
        }
        catch (JSONException r){
            System.out.println("ERROR PROB : "+  r);
            //  Toast.makeText(ListOfFlights.this,"ERROR PROB : "+ r,Toast.LENGTH_LONG).show();

        }

    }

在我的适配器中,我已经附加了将在列表中显示数据外观的布局,并且还设置了我的 POJO类,其中包含 getter和setters < / em> ,但是当我尝试将 adapter 附加到RecyclerView时数据不会绑定原因?

修改

我的适配器类

public class FlightAdapter  extends RecyclerView.Adapter<FlightHolder>  {


    private List<FlightModel> itemList= Collections.emptyList();
    private Context context;

    public FlightAdapter(Context context,List<FlightModel> itemList) {

        this.context = context;
        this.itemList = itemList;
    }

    @Override
    public FlightHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {

        View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.new_details, parent, false);
        FlightHolder rcv = new FlightHolder(layoutView, context);
        return rcv;
    }

    @Override
    public void onBindViewHolder(FlightHolder holder, int position) {

        final FlightModel sr = itemList.get(position);
        final String DepartureAirport = sr.getDepartureAirport();
        final String ArrivalAirport = sr.getArrivalAirport();
        final String Duration = sr.getDuration();
        final String DepartureTime = sr.getDeparturTimee();
        final String ArrivalTime = sr.getArrivalTime();
        final String Stops = sr.getStops();
        final String DirectFlight = sr.getDirectFlights();

        holder.from_txt.setText(DepartureAirport);
        holder.to_txt.setText(ArrivalAirport);
        holder.duration_txt.setText(Duration);
        holder.depature_txt.setText(DepartureTime);
        holder.arrival_txt.setText(ArrivalTime);
        holder.stops_txt.setText(Stops);
        holder.dept_txt.setText(DepartureAirport);
        holder.arr_txt.setText(ArrivalAirport);


        holder.root.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
              //  Intent i = new Intent(FlightAdapter.this.context, DetailsLocalLeader.class);
              //  context.startActivity(i);


            }
        });


    }

    @Override
    public int getItemCount() {
;
        return itemList.size();
    }

}

有关详细信息,请参阅下面的项目链接: https://github.com/huxaiphaer/FlightsApp/blob/master/app/src/main/java/adapter/FlightAdapter.java

2 个答案:

答案 0 :(得分:1)

尝试使用适合您的适配器:

public class FlightAdapter  extends RecyclerView.Adapter<FlightAdapter.MyViewHolder>  {

    private List<FlightModel> mItemList;
    private Context context;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        //TODO: Add all your views and the types hear!
        Public TextView mTvName;

        public MyViewHolder(View v){
            super(v);
            //TODO: add here for each view in your row
            mTvName = (TextView)v.findViewById(R.id.tvName);
        }
    }


    public FlightAdapter(Context context,List<FlightModel> itemList) {
        this.context = context;
        this.mItemList = itemList;
    }


    @Override
    public FlightHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.new_details, parent, false);
        return new MyViewHolder(layoutView);
    }


    @Override
    public void onBindViewHolder(FlightHolder holder, int position) {
        FlightModel model = mItemList.get(position);

        //TODO: Add for each view and data point!!
        String name = model.getName();
        holder.mTvName.setText(name);

        holder.layoutView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
              //  Intent i = new Intent(FlightAdapter.this.context, DetailsLocalLeader.class);
              //  context.startActivity(i);


            }
        });


    }

    @Override
    public int getItemCount() {
        return mItemList.size();
    }

}

<强>声明!

我在文本编辑器中输入了这个,因此可能会出现一些语法错误或拼写错误。如果您有任何问题,请告诉我。

答案 1 :(得分:1)

首先,让某人检查您的代码结构。阅读并理解Java标准命名约定。为您的应用程序使用设计模式,可能是MVP。使用Gson库为您解析JSON数据。

要回答你的问题,我会说你的JSON结构存在缺陷。您的代码输出此错误

  

错误PROB:org.json.JSONException:类型org.json.JSONArray在Flight处的值“SOME_LONG_JSON”无法转换为JSONObject

这意味着您正在尝试将JSONArray解析为JSONObject。在Schedule数组中,有第9个条目应该是JSONObject(如前8个条目所示)。但是,它是一个JSONArray。

所以,前8个条目就像:

{
    "Departure": {},
    "Arrival": {},
    "MarketingCarrier": {},
    "Equipment": {},
    "Details": {}
}

并且,第9个条目如下:

[
    {
        "Departure": {},
        "Arrival": {},
        "MarketingCarrier": {},
        "Equipment": {},
        "Details": {}
    },
    {
        "Departure": {},
        "Arrival": {},
        "MarketingCarrier": {},
        "Equipment": {},
        "Details": {}
    }
]

这就是为什么你在try-catch块中得到这个解析异常的原因。所以,你可以在parseJson(String result)中检查你的对象是JSONArray还是JSONObject:

Object departureObject = arr.getJSONObject(i).getJSONObject("Flight").get("Departure");
if (departureObject instanceof JSONObject) {

    String departureAirport = ((JSONObject) departureObject).getString("Airport");
}
else if (departureObject instanceof JSONArray) {

    JSONArray departures = (JSONArray) departureObject;

    // use for-loop here to get data from array
}

但是,严肃地说,将POJO与Gson一起使用并简化解析过程。此外,如果您可以控制API的工作方式,请尝试仅保留一种类型的对象。如果它应该是一个列表,那么即使没有项目或者有一个或多个项目,它最好是一个列表。

试试这些东西,它可能会解决这个问题,但我对此表示怀疑。我认为解析会遇到更多问题。完成此操作后给我打分。

此外,如果您尝试解析服务器收到的所有JSON,您将看到它甚至不完整。看看your JSON data的结尾。