代码之家  ›  专栏  ›  技术社区  ›  Lutaaya Huzaifah Idris

Recyclerview json数据绑定失败

  •  0
  • Lutaaya Huzaifah Idris  · 技术社区  · 7 年前

    我试图将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();
    
            }
    
        }
    

    在我的适配器中,我附加了布局,该布局将具有列表中数据的外观,以及 波乔班 设置为同时具有 接球手和接球手 ,但当我尝试连接 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 回复  |  直到 7 年前
        1
  •  1
  •   rupinderjeet    7 年前

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

    为了回答你的问题,我想说你的JSON结构有缺陷。您的代码输出此错误

    错误问题:组织。json。JSONException:在org类型的航班上输入“SOME\u LONG\u JSON”。json。JSONArray无法转换为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块中出现此解析异常。所以,您可以这样做来检查您的对象是JSONArray还是JSONObject,如中所示 parseJson(String result) :

    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 .

        2
  •  1
  •   Barns    7 年前

    为适配器尝试以下操作:

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

    免责声明

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