2017-04-02 8 views
1

この問題は長い間悩まされています。私はbmobというクラウドデータベースを使用しています。私が望むデータを正常に取得できることがわかりました。しかし、ループにはいくつかの間違いがあり、最後に選択した項目の情報しか取得できませんでした。アンドロイドがループに何か問題があります。ハッシュマップに値を入れることができません。

p.s.プレイリストと呼ばれる配列リストを使用して、次のアクティビティでリストビューを表示するために使用する計算データを保存します。ここ

は私のコードです:

public class DestinationActivity extends Activity implements OnClickListener, NumberPicker.OnValueChangeListener { 

private TextView from_place, date, days, start_time, end_time, number, money_view; 
private Button addButton, subButton; 
private ImageView backButton, telephone; 
private ListView listView; 
private Button destinationOk_btn; 
private ShapeLoadingDialog shapeLoadingDialog; 

private Tip startTip; 

private Calendar calendar; 
private DatePickerDialog dialog; 
private TimePickerDialog dialog2; 

private List<Destination> destinationList = new ArrayList<Destination>(); 


private DestinationAdapter adapter; 

private int number_value = 1; 

private String time_start; 
private String time_end; 
private int travel_days; 
double travelTime;//total playing time 
double travel_time; 
private int money; 
private int num = 1; 


private ArrayList<Integer> select_placeID = new ArrayList<Integer>(); 
public Map<Integer,Double> weightMap; 
public List<Plan> planList = new ArrayList<Plan>(); 
int[] selectedID = new int[10]; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.destination_layout); 

    //initialize the cloud database 
    Bmob.initialize(this, BmobConfig.APP_ID); 

    listView = (ListView) findViewById(R.id.list_destination); 

    destinationOk_btn = (Button) findViewById(R.id.okButton); 


    initDestinations(); // initialize the data 


    adapter = new DestinationAdapter(destinationList, DestinationActivity.this); 
    //adapter = new DestinationAdapter(this, destinationList, DestinationAdapter.getIsSelected()); 
    listView.setAdapter(adapter); 

    //....listeners and textviews....... 

    //submit button 
    destinationOk_btn.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      select_placeID.clear(); 

      for (int i = 0; i < destinationList.size(); i++) { 
       if (DestinationAdapter.getIsSelected().get(i)) { 
        select_placeID.add((i + 1)); 
       } 

      } 

      //change to int array 
      selectedID = new int[select_placeID.size()]; 
      for(int i = 0;i<select_placeID.size();i++){ 
       selectedID[i] = select_placeID.get(i); 
      } 

      if (select_placeID.size() == 0) { 
       AlertDialog.Builder builder1 = new AlertDialog.Builder(DestinationActivity.this); 
       builder1.setMessage("no records"); 
       builder1.show(); 
      } 
      else { 
       AlertDialog.Builder builder = new AlertDialog.Builder(DestinationActivity.this); 

       builder.setMessage("waiting for magic..."); 
       builder.show(); 

       /** 
       * calculate the route 
       */ 
       if (validate()) { 
        new calRoute().execute(); 
       } 


      } 
     } 

    }); 
} 



//initialize the data 
private void initDestinations() { 
    //........ 
} 


@Override 
public void onClick(View v) { 
    //....... 
} 


/** 
* asynctask 
*/ 
private class calRoute extends AsyncTask<Void, Void, List<Plan>>{ 


    public calRoute(){ 
     // TODO Auto-generated constructor stub 
    } 


    @Override 
    protected List<Plan> doInBackground(Void... params) { 

     List<Plan> result = calculate(time_start, time_end, travel_days); 

     return result; 
    } 


    @Override 
    protected void onPostExecute(List<Plan> result) { 
     super.onPostExecute(result); 
     if (result != null) { 
      Toast.makeText(DestinationActivity.this, "success", Toast.LENGTH_SHORT).show(); 

      if(planList.size() > 0) { 


       Intent intent = new Intent(); 
       intent.setClass(DestinationActivity.this, ActivityPlan.class); 

       intent.putParcelableArrayListExtra("planInfo", (ArrayList<? extends Parcelable>) planList); 

       startActivity(intent); 
      } 

      else{ 
       Toast.makeText(DestinationActivity.this, "no plan", Toast.LENGTH_SHORT).show(); 
      } 
     } 

    } 
} 


/** 
*plan 
**/ 
public List<Plan> calculate(String time_start, String time_end, int travel_days) { 


    SimpleDateFormat df = new SimpleDateFormat(("HH:mm")); 

    Date starttime = new Date(); 
    Date endtime = new Date(); 
    try { 
     starttime = df.parse(time_start); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
    try { 
     endtime = df.parse(time_end); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 

    double l = endtime.getTime() - starttime.getTime(); 
    double hour = (l/(60 * 60 * 1000)); 
    double min = ((l/(60 * 1000)) - hour * 60); 

    if(min == 0){ 
     min = 60; 
    } 
    else { 
     travel_time = ((1.0 * travel_days * hour) * (min/60)); 
     DecimalFormat decimalFormat = new DecimalFormat("#.0"); 
     travelTime = Double.parseDouble(decimalFormat.format(travel_time)); 
    } 


    weightMap = new LinkedHashMap<Integer, Double>(); //store weight 
    int totalPriority = 0;//total priority 

    final Destination start = new Destination(116.32133, 39.92269); 


    final HashMap<Integer, Integer> pMap = new HashMap<Integer, Integer>(); 
    final HashMap<Integer, String> nameMap = new HashMap<Integer, String>(); 
    final HashMap<Integer, Destination> objectMap = new LinkedHashMap<Integer, Destination>(); 
    /** 
    * get the data from cloud database 
    */ 
      BmobQuery<Destination> query = new BmobQuery<Destination>(); 
      for (int sid: selectedID) { 

       query.addWhereEqualTo("id", sid); 


       query.findObjects(new FindListener<Destination>() { 

        @Override 
        public void done(List<Destination> list, BmobException e) { 
         if (e == null) { 
          System.out.println("success:total" + list.size() + "items。"); 
          for (Destination destination : list) { 


           int p = destination.getPriority(); 

           int id = destination.getId(); 

           String name = destination.getName(); 

           double longitude = destination.getLongitude(); 
           double latitude = destination.getLatitude(); 

           objectMap.put(id, new Destination(longitude, latitude)); 

           System.out.println(id); 


           double dis = DistanceUtil.distance(start.getLongitude(), start.getLatitude(), 
             longitude, latitude); 

           pMap.put(id, p); 
           weightMap.put(id, new Double(dis)); 
           nameMap.put(id, name); 

          } 
         } else { 
          Log.i("bmob", "error:" + e.getMessage() + "," + e.getErrorCode()); 
         } 
        } 
       }); 
      } 


    for (Integer key : pMap.keySet()) { 
     int p = pMap.get(key).intValue(); 
     totalPriority = totalPriority + p; 
    } 


    double weight = 0.0; 
    for (Map.Entry<Integer, Double> hm : weightMap.entrySet()) { 
     double hm2Value = pMap.get(hm.getKey()); 
     weight = totalPriority/hm.getValue() * hm2Value; 

     weightMap.put(hm.getKey(), weight); 
    } 


    /** 
    * 按照weight值来排序 
    * 判断是否传递数据给plan_activity 
    */ 
    MapUtil.sortByValue(weightMap); 

    //排好序后计算距离 
    Iterator it = weightMap.entrySet().iterator(); 
    int order = 0; 
    while (it.hasNext()) { 
     order++; 
     Map.Entry entry = (Map.Entry) it.next(); 
     objectMap.put(new Integer(order), objectMap.get(entry.getKey())); 
    } 


    PlanTask planTask = new PlanTask();//封装了每个plan计算的方法 


    for (Map.Entry<Integer, Double> entry : weightMap.entrySet()) { 
     System.out.println("id= " + entry.getKey()); 


     double play_time = planTask.calPlay_time(weightMap.size(), 
       weightMap.get(entry.getKey()), travelTime); 

     double driving_time = planTask.calDrive_time(DistanceUtil.distance(
       objectMap.get(entry.getKey()).getLatitude(), 
       objectMap.get(entry.getKey()).getLongitude(), 
       objectMap.get(entry.getKey() + 1).getLatitude(), 
       objectMap.get(entry.getKey() + 1).getLongitude() 
     )); 

     String arrive_time = "hello world";//未完待续 

     String place_name = nameMap.get(entry.getKey()); 

     Plan plan = new Plan(place_name, arrive_time, driving_time, play_time); 

     //传递plan对象list 
     planList.add(entry.getKey(), plan); 
    } 

    return planList; 

} 

}

私はそれをデバッグするとき、私は計算()関数では、

BmobQuery<Destination> query = new BmobQuery<Destination>(); 
      for (int sid: selectedID) { 

       query.addWhereEqualTo("id", sid); 


query.findObjects(new FindListener<Destination>() { 

        @Override 
        public void done(List<Destination> list, BmobException e) { 
         if (e == null) { 
          System.out.println("success:total" + list.size() + "items。"); 
          for (Destination destination : list) { 

           int p = destination.getPriority(); 

           int id = destination.getId(); 

           String name = destination.getName(); 


           double longitude = destination.getLongitude(); 
           double latitude = destination.getLatitude(); 

           objectMap.put(id, new Destination(longitude, latitude)); 

           System.out.println(id); 

           //calculate the distance 
           double dis = DistanceUtil.distance(start.getLongitude(), start.getLatitude(), 
             longitude, latitude); 

           pMap.put(id, p); 
           weightMap.put(id, new Double(dis)); 
           nameMap.put(id, name); 

          } 
         } else { 
          Log.i("bmob", "error:" + e.getMessage() + "," + e.getErrorCode()); 
         } 
        } 
       }); 

の出力が「成功であることがわかった:合計1項目。ループの後に3つの項目を選択すると、「成功:合計1項目」になります。最後の項目の情報だけが捕捉されます。 3つのハッシュマップのサイズ:pMap、nameMapおよびobjectMapはすべてゼロです。それはなぜです???それは非常に奇妙です...

LogCATにエラーはありませんが、順序付きリストビューは2番目のアクティビティに表示されません。どうか私を助けてください、それは私を長い間悩ませました。 ありがとうございました!

答えて

0

プラットフォームは、一般的にrxjavaの多くを使用していますが、ここでは、コードを少し

final HashMap<Integer, Integer> pMap = new HashMap<Integer, Integer>(); 
final HashMap<Integer, String> nameMap = new HashMap<Integer, String>(); 
final HashMap<Integer, Destination> objectMap = new LinkedHashMap<Integer, Destination>(); 

/** 
* get the data from cloud database 
*/ 
BmobQuery<Destination> query = new BmobQuery<Destination>(); 

// this time only one list of three elements is added instead of three lists of one element each 
query.addWhereContainedIn("id", Arrays.asList(selectedID)); 

query.findObjects(new FindListener<Destination>() { 
       @Override 
       public void done(List<Destination> list, BmobException e) { 
        if (e == null) { 
         System.out.println("success:total" + list.size() + "items。"); 
         for (Destination destination : list) { 

          int p = destination.getPriority(); 

          int id = destination.getId(); 

          String name = destination.getName(); 


          double longitude = destination.getLongitude(); 
          double latitude = destination.getLatitude(); 

          objectMap.put(id, new Destination(longitude, latitude)); 

          System.out.println(id); 

          //calculate the distance 
          double dis = DistanceUtil.distance(start.getLongitude(), start.getLatitude(), 
            longitude, latitude); 

          pMap.put(id, p); 
          weightMap.put(id, new Double(dis)); 
          nameMap.put(id, name); 

         } 
         // continue execution here though you won't be able to return a list of plans here 
        } else { 
         Log.i("bmob", "error:" + e.getMessage() + "," + e.getErrorCode()); 
        } 
       } 
}); 
を高めるであろう何かであるように私は、まだ反応性プログラミングに本当に快適おりませんので、私は、非常に残念な把握ができませんでした

この情報がお役に立てば幸いです:)

+0

おかげで多くのことを試してみてください!私はこのメソッドを試していますが、メソッドfindObject()はクラウドプラットフォームによって記述されています。実際には私はマルチスレッドの初心者ですが、これを行う方法はわかりません。同期(this){... findObject().........}を追加しようとしていますが、これはうまくいきません... –

+0

残念ながら、同期方法はありませんフレームワークによって提供されていません。しかし、コードが動作するためのいくつかの変更が必要、私はすぐに回答を編集します –

+0

thxたくさん!私は答えを待つだろう〜 –

0
List<HashMap<Integer, Destination>> listmap=new ArrayList<>; 
    final HashMap<Integer, Destination> objectMap; 

    /** 
    * get the data from cloud database 
    */ 
    BmobQuery<Destination> query = new BmobQuery<Destination>(); 

    // this time only one list of three elements is added instead of three lists of one element each 
    query.addWhereContainedIn("id", Arrays.asList(selectedID)); 

    query.findObjects(new FindListener<Destination>() { 
        @Override 
        public void done(List<Destination> list, BmobException e) { 
         if (e == null) { 
          System.out.println("success:total" + list.size() + "items。"); 
          for (Destination destination : list) { 
           objectMap = new LinkedHashMap<Integer, Destination>(); 
int id = destination.getId(); 
           objectMap.put(id, destination); 
           listmap.add(objectMap); 

          } 
          // continue execution here though you won't be able to return a list of plans here 
         } else { 
          Log.i("bmob", "error:" + e.getMessage() + "," + e.getErrorCode()); 
         } 
        } 

助けるために、この

関連する問題