2017-03-27 31 views
-1

我有一个自定义类飞行和内部类的票价访问通过将InnerClass在OuterClass对象的对象

public class Flight { 
    private String airlineCode; 
    private String airlineClass; 
    private String originCode; 
    private String destinationCode; 
    private String departureTime; 
    private String ArrivalTime; 

    public Flight (String originCode,String destinationCode,String departureTime,String arrivalTime, 
        String airlineCode, String airlineClass){ 
     this.originCode=originCode; 
     this.destinationCode=destinationCode; 
     this.departureTime=departureTime; 
     this.ArrivalTime=arrivalTime; 
     this.airlineCode=airlineCode; 
     this.airlineClass=airlineClass; 

    } 

    public String getAirlineCode() { 
     return airlineCode; 
    } 

    public void setAirlineCode(String airlineCode) { 
     this.airlineCode = airlineCode; 
    } 

    public String getAirlineClass() { 
     return airlineClass; 
    } 

    public void setAirlineClass(String airlineClass) { 
     this.airlineClass = airlineClass; 
    } 

    public String getOriginCode() { 
     return originCode; 
    } 

    public void setOriginCode(String originCode) { 
     this.originCode = originCode; 
    } 

    public String getDestinationCode() { 
     return destinationCode; 
    } 

    public void setDestinationCode(String destinationCode) { 
     this.destinationCode = destinationCode; 
    } 

    public String getDepartureTime() { 
     return departureTime; 
    } 

    public void setDepartureTime(String departureTime) { 
     this.departureTime = departureTime; 
    } 

    public String getArrivalTime() { 
     return ArrivalTime; 
    } 

    public void setArrivalTime(String arrivalTime) { 
     ArrivalTime = arrivalTime; 
    } 

    //Inner Class 
    class Fare{ 
     private String providerId; 
     private String fare; 

     public Fare(String providerId,String fare){ 
      this.providerId=providerId; 
      this.fare=fare; 
     } 

     public String getProviderId() { 
      return providerId; 
     } 

     public String getFare() { 
      return fare; 
     } 
    } 
} 

我有我必须遍历并把值的自定义类中的样本JSON。以下是JSON的简短示例。

{ 
    "flights": [ 
    { 
     "originCode": "DEL", 
     "destinationCode": "BOM", 
     "departureTime": 1396614600000, 
     "arrivalTime": 1396625400000, 
     "fares": [ 
     { 
      "providerId": 1, 
      "fare": 11500 
     }, 
     { 
      "providerId": 2, 
      "fare": 10500 
     } 
     ], 
     "airlineCode": "G8", 
     "class": "Business" 
    }, 
    { 
     "originCode": "DEL", 
     "destinationCode": "BOM", 
     "departureTime": 1396616400000, 
     "arrivalTime": 1396623600000, 
     "fares": [ 
     { 
      "providerId": 1, 
      "fare": 14400 
     }, 
     { 
      "providerId": 3, 
      "fare": 14000 
     } 
     ], 
     "airlineCode": "AI", 
     "class": "Business" 
    } 
    ] 
} 

我解析和创建的ArrayList这样

public static final ArrayList<Flight> extractdata(String jsonResponse) { 
     ArrayList<Flight> flights = new ArrayList<Flight>(); 

     try { 
      JSONObject rootobject = new JSONObject(jsonResponse); 

      JSONArray flight = rootobject.getJSONArray("flights"); 

      for (int i = 0; i < flight.length(); i++) { 
       JSONObject arrayObject = flight.getJSONObject(i); 

       String originCode = arrayObject.getString("originCode"); 
       Log.d(LOG_TAG,"originalcode"+ originCode); 
       String destinationCode = arrayObject.getString("destinationCode"); 
       Log.d(LOG_TAG,"destinationcode"+ destinationCode); 
       String departureTime = arrayObject.getString("departureTime"); 
       Log.d(LOG_TAG,"departuretime"+ departureTime); 
       String arrivalTime = arrayObject.getString("arrivalTime"); 
       Log.d(LOG_TAG,"arrivaltime"+ arrivalTime); 
       String airlineCode = arrayObject.getString("airlineCode"); 
       Log.d(LOG_TAG,"airlinecode"+ airlineCode); 
       String airlineClass = arrayObject.getString("class"); 
       Log.d(LOG_TAG,"class"+ airlineClass); 
       Long eTime = Long.parseLong(arrivalTime); 
       Date dateObject = new Date(eTime); 
       Long dTime = Long.parseLong(departureTime); 
       Date dateObject2 = new Date(dTime); 
       SimpleDateFormat dateFormat = new SimpleDateFormat("HH mm "); 
       String arrival = dateFormat.format(dateObject); 
       String depart = dateFormat.format(dateObject2); 
       JSONArray arrayFare=arrayObject.getJSONArray("fares"); 

       String providerId; 
       String fare; 
       int number=arrayFare.length(); 
       Flight flightObject=new Flight(originCode,destinationCode,depart,arrival,airlineCode,airlineClass); 
       for (int j=0;j<arrayFare.length();j++){ 
        JSONObject arrayFareObject=arrayFare.getJSONObject(j); 
        providerId=arrayFareObject.getString("providerId"); 
        fare=arrayFareObject.getString("fare"); 
        Log.d(LOG_TAG,"providerId & fare :"+providerId+" "+fare); 
        Flight.Fare fareObject[]= new Flight.Fare[number]; 
        fareObject[j]=flightObject.new Fare(providerId,fare); 
       } 
       flights.add(flightObject); 
      }  
     } catch (JSONException e) { 
      Log.e(LOG_TAG, "problem parsing jsone", e); 
     } 
     return flights;  
    } 

现在我需要访问被点击了哪个航班的对象对象将InnerClass。我怎么做。我无法访问这些对象。

我想这样。

public void updateUi(final ArrayList<Flight> flights1) 
{ 

    final FlightAdapter flightAdapter=new FlightAdapter(this,flights1); 
    ListView flightlistview=(ListView)findViewById(R.id.list); 
    flightlistview.setAdapter(flightAdapter); 
    flightlistview.setOnItemClickListener(new AdapterView.OnItemClickListener() 
    { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
     { 
      Flight flight=flightAdapter.getItem(position); 
      Intent fareintent=new Intent(FlightSearchActivity.this,FareActivity.class); 
      startActivity(fareintent); 
     } 
    }); 
} 
+1

您需要'Fare'的对象作为'Flight'类的属性。使用数据获取并设置此属性。 –

+0

@Prera​​kSola如果你可以举一个例子来澄清我的疑问,这将有很大的帮助。提前致谢。 –

回答

1

您需要为您的班级提供票价对象。

如果您这样做,只需创建一个类型为Fare的对象,而不会连接到特定的Flight Object。

Flight.Fare fareObject[]= new Flight.Fare[number]; 
fareObject[j]=flightObject.new Fare(providerId,fare); 

相反,声明票价对象与你Fligt类中的其他变量一起:

... 
private String destinationCode; 
private String departureTime; 
private String ArrivalTime; 
Fare fare; 

编辑:添加票价数组用于飞行的多票价

.. 
ArrayList<Fare> fares; 
+0

谢谢。我明白你的观点。但由于票价可以是动态的,我不得不拿票价; 但主要的疑问是通过外部对象访问内部对象,那么没有直接的方法来做到这一点? –

2

做到这一点的一种方法是,因为每个航班都有不同航空公司的票价。您可以将票价ArrayList作为每个航班的属性。

List<Fare> fares 

然后在阅读json响应时,您可以阅读并创建单独的票价类实例,并将这些实例添加到票价列表中。并且一旦您完成将单个航班的所有票价添加到列表中,将该列表设置为Flight实例的票价属性。

List<Fare>fares=new ArrayList<Fare>(); 
//This code should be in a loop so you can add all the fares to the ArrayList 

Fare f=new Fare(); 
f.setProviderId("AI"); 
f.setFare("12000"); 

fares.add(f); 

现在的票价列表添加到飞行实例 flight.setFares(fares)

希望这有助于。

+0

谢谢。有效。那么我有没有办法通过外部对象直接访问InnerObject? –

1

修改您的Flight类别:

public class Flight { 
    private String airlineCode; 
    private String airlineClass; 
    private String originCode; 
    private String destinationCode; 
    private String departureTime; 
    private String ArrivalTime; 
    private List<Fare> fares; 

    public Flight (String originCode,String destinationCode,String departureTime,String arrivalTime, String airlineCode, String airlineClass, List<Fare> fares){ 
     this.originCode=originCode; 
     this.destinationCode=destinationCode; 
     this.departureTime=departureTime; 
     this.ArrivalTime=arrivalTime; 
     this.airlineCode=airlineCode; 
     this.airlineClass=airlineClass; 
     this.fares = fares; 
    } 
    ... //Other getters and setters 

    public List<Fare> getFares() { 
     return fares; 
    } 

    public void setFares(List<Fare> fares) { 
     this.fares = fares; 
    } 

    ... //Inner class code 
} 

现在,在您extractdata方法,

public static final ArrayList<Flight> extractdata(String jsonResponse) { 
     ArrayList<Flight> flights = new ArrayList<Flight>(); 

     try { 
      JSONObject rootobject = new JSONObject(jsonResponse); 

      JSONArray flight = rootobject.getJSONArray("flights"); 

      for (int i = 0; i < flight.length(); i++) { 
       JSONObject arrayObject = flight.getJSONObject(i); 

       String originCode = arrayObject.getString("originCode"); 
       String destinationCode = arrayObject.getString("destinationCode"); 
       String departureTime = arrayObject.getString("departureTime"); 
       String arrivalTime = arrayObject.getString("arrivalTime"); 
       String airlineCode = arrayObject.getString("airlineCode"); 
       String airlineClass = arrayObject.getString("class"); 
       Long eTime = Long.parseLong(arrivalTime); 
       Date dateObject = new Date(eTime); 
       Long dTime = Long.parseLong(departureTime); 
       Date dateObject2 = new Date(dTime); 
       SimpleDateFormat dateFormat = new SimpleDateFormat("HH mm "); 
       String arrival = dateFormat.format(dateObject); 
       String depart = dateFormat.format(dateObject2); 
       JSONArray arrayFare = arrayObject.getJSONArray("fares"); 

       List<Fare>fares=new ArrayList<Fare>(); 

       for (int j=0;j<arrayFare.length();j++){ 
        JSONObject arrayFareObject = arrayFare.getJSONObject(j); 
        String providerId = arrayFareObject.getString("providerId"); 
        String fare = arrayFareObject.getString("fare"); 
        Flight.Fare fareObject = new Flight.Fare(providerId, fare); 
        fares.add(fareObject); 
       } 
       Flight flightObject = new Flight(originCode, destinationCode, depart, arrival, airlineCode, airlineClass, fares); 
       flights.add(flightObject); 
      } 


     } catch (JSONException e) { 
      Log.e(LOG_TAG, "problem parsing jsone", e); 
     } 
     return flights;  
    } 

现在,在您updateUi功能,您可以通过调用getFares方法得到fares

public void updateUi(final ArrayList<Flight> flights1) { 

    final FlightAdapter flightAdapter = new FlightAdapter(this,flights1); 
    ListView flightlistview = (ListView)findViewById(R.id.list); 
    flightlistview.setAdapter(flightAdapter); 
    flightlistview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Flight flight = flightAdapter.getItem(position); 
      List<Fare> fares = flight.getFares(); //This will have all the fares. 
      Intent fareintent = new Intent(FlightSearchActivity.this,FareActivity.class); 

      startActivity(fareintent); 

     } 
    }); 
} 

警告:我没有测试此代码,但它应该与这些相似。

+0

谢谢,它的工作。 –