2014-10-04 4 views
1

Я создал список ArrayList1 и ArrayListArrayList> final_list. list1 включает информацию об одном клиенте и final_list для многих клиентов. Для простоты я предоставляю нужный сегмент кода.Overriding ArrayList

public class CheckItineraries extends FragmentActivity { 

private ProgressDialog pDialog; 
String username, origin_lat, origin_lng, destination_lat, destination_lng, 
     waypoint1_lat, waypoint1_lng, waypoint2_lat, waypoint2_lng, 
     waypoints; 
int i, j, b; 
TextView v1, v2; 
String start_pro , final_pro; 

double z = 0; 
ListView list; 
ArrayList<LatLng> markerPoints; 
ArrayList<Double> sum = new ArrayList<Double>(); 
ArrayList<Double> differ = new ArrayList<Double>(); 

ArrayList<HashMap<String, String>> final_List = new ArrayList<HashMap<String, String>>(); 

// URL to get contacts JSON 
private static String LOGIN_URL = "http://XXXXXXXXXXXXXXXX/check_itineraries.php"; 

public static final String PREFS_NAME = "MyPreferencesFile"; 

// JSON Node names 

JSONParser jsonParser = new JSONParser(); 

// contacts JSONArray 
JSONArray contacts = null; 

// Hashmap for ListView 
ArrayList<HashMap<String, String>> itinList; 

ArrayList<String> list1 = new ArrayList<String>(); 

ArrayList<ArrayList<String>> final_list = new ArrayList<ArrayList<String>>(); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.checkitineraries); 

    itinList = new ArrayList<HashMap<String, String>>(); 

    new GetData().execute(); 
} 

private class GetData extends AsyncTask<Void, Void, Void> { 

    public void onPreExecute() { 
     super.onPreExecute(); 
     Log.d("meg", "meg"); 

     pDialog = new ProgressDialog(CheckItineraries.this); 
     pDialog.setMessage("Επεξεργάζομαι τα στοιχεία..."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(true); 
     pDialog.show(); 

     SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); 
     username = settings.getString("username", "nikos"); 

    } 

    protected Void doInBackground(Void... args) { 
     // TODO Auto-generated method stub 

     try { 

      // Building Parameters 
      List<NameValuePair> params = new ArrayList<NameValuePair>(); 
      params.add(new BasicNameValuePair("username", username)); 

      JSONObject json = jsonParser.makeHttpRequest(LOGIN_URL, "POST", 
        params); 

      // JSONObject jObj = new JSONObject(); 
      JSONArray itin_results = json.getJSONArray("itin_results"); 

      for (int i = 0; i < itin_results.length(); i++) { 
       JSONObject c = itin_results.getJSONObject(i); 

       String username = c.getString("username"); 
       String startPoliPro = c.getString("startPoliPro"); 
       String start_lat_pro = c.getString("start_lat_pro"); 
       String start_lng_pro = c.getString("start_lng_pro"); 
       String finalPoliPro = c.getString("finalPoliPro"); 
       String final_lat_pro = c.getString("final_lat_pro"); 
       String final_lng_pro = c.getString("final_lng_pro"); 

       list1.add(username); 
       list1.add(startPoliPro); 
       list1.add(finalPoliPro); 

       final_list.add(i, list1); 

       Log.d("list1",list1.toString()); 

       Log.d("final_list", final_list.toString()); 

       list1.clear(); 

Проблема состоит в том, что вторая запись list1 в final_list переопределяет первый.

LogCat

10-04 15:46:22.249: D/list1(25850): [p, Athens, Halkida] 
10-04 15:46:22.249: D/final_list(25850): [[p, Athens, Halkida]] 
10-04 15:46:22.249: D/list1(25850): [e, Athens, Larissa] 
10-04 15:46:22.249: D/final_list(25850): [[e, Athens, Larissa], [e, Athens, Larissa]] 

Я знаю, что его элементарно, но я признателен за любую помощь.

ответ

0

Не объявляйте ArrayList<String> list1 = new ArrayList<String>(); на уровне класса, проблема в ссылке добавлена ​​(не глубокая копия). Вместо этого объявить его в петле for() -

for (int i = 0; i < itin_results.length(); i++) { 
    List<String> list1 = new ArrayList<>(); // <-- Use the interface and Java 7+ 
              //  can use diamond operator 
    JSONObject c = itin_results.getJSONObject(i); 
    // ... 
    // list1.clear(); // <-- didn't work because of shallow copy. 
} 

Или, используйте глубокую копию путем перехода от

final_list.add(i, list1); 

в

final_list.add(i, new ArrayList<>(list1)); // <-- Diamond Operator 
+0

Большое спасибо Elliott –