Skip to content

Commit f69d14a

Browse files
committed
1.搜索逻辑优化
2.每页结果合并后先按距离排序再输出
1 parent e94e4c0 commit f69d14a

14 files changed

Lines changed: 129 additions & 75 deletions

app/src/main/java/net/coding/program/maopao/BaiduLbsLoader.java

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@
2525
import java.util.Map;
2626
import java.util.Map.Entry;
2727

28-
import static android.location.Location.convert;
29-
3028
public class BaiduLbsLoader {
3129
private static final String host = "http://api.map.baidu.com";
3230
private static final String geotable = "95956";
@@ -39,18 +37,17 @@ public static String getUserId(Context context) {
3937
return userObject == null ? "" : String.valueOf(userObject.id);
4038
}
4139

42-
public static interface LbsResultListener{
43-
void onSearchResult(boolean success, List<LocationObject> list, boolean hasMore);
40+
public static interface LbsResultListener {
41+
void onSearchResult(boolean success, List<LocationObject> list, boolean hasMore);
4442
}
4543

46-
public static void search(Context context, String keyword, double latitude, double longitude,final int page, final LbsResultListener listener) {
44+
public static void search(Context context, String keyword, double latitude, double longitude, final int page, final LbsResultListener listener) {
4745
final String path = "/geosearch/v3/nearby";
4846
LinkedHashMap<String, String> params = new LinkedHashMap<>();
4947
params.put("ak", ak);
5048
UserObject userObject = AccountInfo.loadAccount(context);
51-
if(userObject != null) {
52-
String userid = String.valueOf(userObject.id);
53-
params.put("filter", String.format("userid:[%s,%s]", userid, userid));
49+
if (userObject != null) {
50+
params.put("filter", String.format("userid:[%d,%d]", userObject.id, userObject.id));
5451
}
5552
params.put("geotable_id", geotable);
5653
params.put("q", keyword);
@@ -70,22 +67,23 @@ public static void search(Context context, String keyword, double latitude, doub
7067
client.get(context, url, new JsonHttpResponseHandler() {
7168
@Override
7269
public void onSuccess(int statusCode, Header[] headers, JSONObject json) {
73-
if(json == null || json.optInt("status") != 0){
74-
if(listener != null) listener.onSearchResult(false, null, false);
70+
if (json == null || json.optInt("status") != 0) {
71+
if (listener != null) listener.onSearchResult(false, null, false);
7572
return;
7673
}
77-
int total = json.optInt("total");
78-
if(listener != null) listener.onSearchResult(true,parseList(json), page * PAGE_SIZE < total);
74+
int size = json.optInt("size");
75+
if (listener != null)
76+
listener.onSearchResult(true, parseList(json), size >= PAGE_SIZE);
7977
}
8078

8179
@Override
8280
public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
83-
if(listener != null) listener.onSearchResult(false, null, false);
81+
if (listener != null) listener.onSearchResult(false, null, false);
8482
}
8583

8684
@Override
8785
public void onSuccess(int statusCode, Header[] headers, String responseString) {
88-
if(listener != null) listener.onSearchResult(false, null, false);
86+
if (listener != null) listener.onSearchResult(false, null, false);
8987
}
9088
});
9189
}
@@ -115,6 +113,7 @@ public static LocationObject parseItem(JSONObject json) {
115113
object.longitude = location.optDouble(0, 0);
116114
object.latitude = location.optDouble(1, 0);
117115
}
116+
object.distance = json.optInt("distance");
118117
return object;
119118
}
120119

@@ -142,17 +141,17 @@ public static void store(Context context, String name, String address, double la
142141
public void onSuccess(int statusCode, Header[] headers, JSONObject json) {
143142
String id = null;
144143
boolean success = json != null && !TextUtils.isEmpty(id = json.optString("id"));
145-
if(listener != null) listener.onStoreResult(success, id);
144+
if (listener != null) listener.onStoreResult(success, id);
146145
}
147146

148147
@Override
149148
public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
150-
if(listener != null) listener.onStoreResult(false, null);
149+
if (listener != null) listener.onStoreResult(false, null);
151150
}
152151

153152
@Override
154153
public void onSuccess(int statusCode, Header[] headers, String responseString) {
155-
if(listener != null) listener.onStoreResult(false, null);
154+
if (listener != null) listener.onStoreResult(false, null);
156155
}
157156
});
158157
}
Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package net.coding.program.maopao;
22

3+
import android.view.View;
34
import android.widget.TextView;
45

56
import net.coding.program.BaseActivity;
67
import net.coding.program.R;
78

89
import org.androidannotations.annotations.AfterViews;
9-
import org.androidannotations.annotations.Click;
1010
import org.androidannotations.annotations.EActivity;
1111
import org.androidannotations.annotations.Extra;
1212
import org.androidannotations.annotations.OptionsItem;
@@ -19,27 +19,42 @@
1919
public class LocationDetailActivity extends BaseActivity {
2020
@ViewById
2121
TextView nameText, addressText;
22+
@ViewById
23+
View map_button;
2224
@Extra
2325
double latitude, longitude;
2426
@Extra
25-
String name, address;
27+
String name, address, shareId;
2628

2729
@AfterViews
2830
void afterViews() {
2931
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
3032
nameText.setText(name);
3133
addressText.setText(address);
34+
if (address != null) {
35+
map_button.setOnClickListener(new View.OnClickListener() {
36+
@Override
37+
public void onClick(View v) {
38+
LocationMapActivity_.intent(LocationDetailActivity.this)
39+
.latitude(latitude).longitude(longitude)
40+
.name(name).address(address).start();
41+
}
42+
});
43+
}
44+
// BaiduLbsLoader.requestLocationObject(this, shareId, new BaiduLbsLoader.LocationDetailListner(){
45+
// @Override
46+
// public void onReceiveLocationObject(LocationObject locationObject) {
47+
// if(LocationDetailActivity.this.isFinishing()) return;
48+
// if(locationObject == null) return;
49+
// addressText.setText(address= locationObject.address);
50+
// latitude = locationObject.latitude;
51+
// longitude = locationObject.longitude;
52+
// }
53+
// });
3254
}
3355

3456
@OptionsItem(android.R.id.home)
3557
void close() {
3658
onBackPressed();
3759
}
38-
39-
@Click
40-
void map_button() {
41-
LocationMapActivity_.intent(this)
42-
.latitude(latitude).longitude(longitude)
43-
.name(name).address(address).start();
44-
}
4560
}

app/src/main/java/net/coding/program/maopao/LocationEditActivity.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public class LocationEditActivity extends BaseActivity {
2525
@ViewById
2626
EditText nameText, areaText, addressText;
2727
@Extra
28-
String name, area, address;
28+
String name, city, area, address;
2929
@Extra
3030
double latitude, longitude;
3131

@@ -59,13 +59,14 @@ void action_ok() {
5959
public void onStoreResult(boolean success, String id) {
6060
if (!success) {
6161
Toast.makeText(LocationEditActivity.this, "保存失败,请重试", Toast.LENGTH_SHORT).show();
62-
return;
62+
} else {
63+
final LocationObject data = LocationObject.custom(id, customName, customAddress, latitude, longitude);
64+
data.city = city;
65+
Intent intent = new Intent();
66+
intent.putExtra("location", data);
67+
setResult(RESULT_OK, intent);
68+
finish();
6369
}
64-
final LocationObject data = LocationObject.custom(id, customName, customAddress, latitude, longitude);
65-
Intent intent = new Intent();
66-
intent.putExtra("location", data);
67-
setResult(RESULT_OK, intent);
68-
finish();
6970
}
7071
});
7172
}

app/src/main/java/net/coding/program/maopao/LocationProvider.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,14 @@
88
import com.baidu.location.BDLocationListener;
99
import com.baidu.location.LocationClient;
1010
import com.baidu.location.LocationClientOption;
11+
import com.baidu.mapapi.model.LatLng;
12+
import com.baidu.mapapi.search.core.SearchResult;
13+
import com.baidu.mapapi.search.share.LocationShareURLOption;
14+
import com.baidu.mapapi.search.share.OnGetShareUrlResultListener;
15+
import com.baidu.mapapi.search.share.ShareUrlResult;
16+
import com.baidu.mapapi.search.share.ShareUrlSearch;
17+
18+
import net.coding.program.model.LocationObject;
1119

1220
/**
1321
* Created by Neutra on 2015/3/11.
@@ -73,6 +81,4 @@ public void onReceiveLocation(BDLocation bdLocation) {
7381
public static interface LocationResultListener {
7482
void onLocationResult(boolean success, String city, String area, String address, double latitude, double longitude);
7583
}
76-
77-
7884
}

app/src/main/java/net/coding/program/maopao/LocationSearchActivity.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import android.widget.ImageView;
1313
import android.widget.ListView;
1414
import android.widget.TextView;
15+
import android.widget.Toast;
1516

1617
import com.baidu.mapapi.model.LatLng;
1718

@@ -28,6 +29,7 @@
2829
import org.androidannotations.annotations.OnActivityResult;
2930
import org.androidannotations.annotations.OptionsItem;
3031
import org.androidannotations.annotations.OptionsMenu;
32+
import org.androidannotations.annotations.UiThread;
3133
import org.androidannotations.annotations.ViewById;
3234

3335
import java.util.ArrayList;
@@ -144,13 +146,16 @@ public void onLocationResult(boolean success, String city, String area, String a
144146
}
145147

146148
@ItemClick(R.id.listView)
147-
void onItemClick(LocationObject data) {
149+
void onItemClick(final LocationObject data) {
148150
if (data == null) return;
149151
if (data.type == LocationObject.Type.newCustom) {
150-
LocationEditActivity_.intent(this).name(data.name).area(currentArea).address(currentAddress)
151-
.latitude(latitude).longitude(longitude).startForResult(MaopaoAddActivity.RESULT_REQUEST_LOCATION);
152+
LocationEditActivity_.intent(this)
153+
.name(data.name).city(currentCity).area(currentArea).address(currentAddress)
154+
.latitude(latitude).longitude(longitude)
155+
.startForResult(MaopaoAddActivity.RESULT_REQUEST_LOCATION);
152156
return;
153157
}
158+
data.city = currentCity;
154159
Intent intent = new Intent();
155160
intent.putExtra("location", data);
156161
setResult(RESULT_OK, intent);
@@ -298,8 +303,7 @@ void reload(String keyword) {
298303
if (searcher.isKeywordEmpty()) {
299304
mFootUpdate.dismiss();
300305
} else {
301-
mFootUpdate.showLoading();
302-
searcher.search();
306+
loadMore();
303307
}
304308
}
305309
}

app/src/main/java/net/coding/program/maopao/LocationSearcher.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public boolean isKeywordEmpty() {
2828
return TextUtils.isEmpty(keyword);
2929
}
3030

31-
public void setKeyword(String keyword) {
31+
public synchronized void setKeyword(String keyword) {
3232
keyword = keyword == null ? "" : keyword.toString();
3333
if (!keyword.equals(this.keyword)) {
3434
this.keyword = keyword;
@@ -43,10 +43,14 @@ public boolean isComplete() {
4343
return isComplete;
4444
}
4545

46-
public void search() {
46+
public boolean isSearching() {
47+
return isSearching;
48+
}
49+
50+
public synchronized void search() {
4751
if (isComplete || isSearching) return;
4852
isSearching = true;
49-
searchingVersion = keywordVersion;
53+
searchingVersion = ++keywordVersion;
5054
doSearch(page);
5155
}
5256

app/src/main/java/net/coding/program/maopao/LocationSearcherGroup.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66

77
import net.coding.program.model.LocationObject;
88

9+
import java.util.ArrayList;
10+
import java.util.Collections;
11+
import java.util.Comparator;
912
import java.util.List;
1013

1114
/**
@@ -18,10 +21,24 @@ public class LocationSearcherGroup {
1821
private LocationSearcher.SearchResultListener itemListener = new PublicLocationSearcher.SearchResultListener() {
1922
@Override
2023
public void onSearchResult(List<LocationObject> locations) {
21-
listener.onSearchResult(locations);
24+
if (locations != null) resultBuffer.addAll(locations);
25+
if (!isSearching()) {
26+
// onSearchResult后可能立刻就会重新搜索, 所以要输出的列表放到另一个对象中
27+
List<LocationObject> temp = new ArrayList<>(resultBuffer);
28+
resultBuffer.clear();
29+
Collections.sort(temp, new Comparator<LocationObject>() {
30+
@Override
31+
public int compare(LocationObject lhs, LocationObject rhs) {
32+
return lhs.distance - rhs.distance;
33+
}
34+
});
35+
listener.onSearchResult(temp);
36+
}
2237
}
2338
};
2439

40+
private List<LocationObject> resultBuffer = new ArrayList<>();
41+
2542
public LocationSearcherGroup(String[] keywords) {
2643
if (keywords == null || keywords.length < 1) throw new IllegalArgumentException("keywords");
2744
publicSearchers = new PublicLocationSearcher[keywords.length];
@@ -39,6 +56,7 @@ public LocationSearcherGroup() {
3956
}
4057

4158
public synchronized void destory() {
59+
resultBuffer.clear();
4260
privateSearcher.destory();
4361
for (LocationSearcher searcher : publicSearchers) {
4462
searcher.destory();
@@ -55,12 +73,23 @@ public synchronized void configure(Context context, LatLng latLng, final PublicL
5573

5674
public synchronized void search() {
5775
if (listener == null) return;
76+
if (isSearching()) return;
77+
resultBuffer.clear();
5878
privateSearcher.search();
5979
for (LocationSearcher item : publicSearchers) {
6080
item.search();
6181
}
6282
}
6383

84+
public synchronized boolean isSearching() {
85+
for (LocationSearcher searcher : publicSearchers) {
86+
if (!searcher.isSearching()) {
87+
return false;
88+
}
89+
}
90+
return privateSearcher.isSearching();
91+
}
92+
6493
public synchronized boolean isComplete() {
6594
for (LocationSearcher searcher : publicSearchers) {
6695
if (!searcher.isComplete()) {

app/src/main/java/net/coding/program/maopao/MaopaoAddActivity.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -319,17 +319,11 @@ void uploadText() {
319319
}
320320

321321
params.put("content", content);
322-
//params.put("device", Build.MODEL);
323-
params.put("device", "iPhone 7 Preview");
322+
params.put("device", Build.MODEL);
324323
if(!TextUtils.isEmpty( locationText.getText())) {
325-
params.put("location", locationText.getText());
326-
LocationCoord locationCoord = LocationCoord.from(currentLocation);
327-
if(locationCoord != null) params.put("coord","123456789|123456789|");//locationCoord.toString()
328-
// if(locationCoord != null){
329-
// params.put("location", locationText.getText() + "|||" + locationCoord.toString());
330-
// }else{
331-
// params.put("location", locationText.getText());
332-
// }
324+
params.put("location", currentLocation.type == LocationObject.Type.City?
325+
currentLocation.name : currentLocation.city + "·" + currentLocation.name);
326+
params.put("coord", LocationCoord.from(currentLocation).toString());
333327
}
334328
postNetwork(sendUrl, params, sendUrl);
335329
}

app/src/main/java/net/coding/program/maopao/MaopaoLocationView.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,17 @@ public void bind(final Maopao.MaopaoObject data) {
3838
if (!TextUtils.isEmpty(data.location)) {
3939
this.setText(data.location);
4040
this.setVisibility(View.VISIBLE);
41-
final LocationCoord locationCoord = LocationCoord.parse("23.141118,113.365535,1,广东省广州市天河区");
42-
if (locationCoord != null) {
41+
final LocationCoord locationCoord = LocationCoord.parse(data.coord);
42+
if (data.coord != null) {
4343
this.setOnClickListener(new View.OnClickListener() {
4444
@Override
4545
public void onClick(View v) {
4646
LocationDetailActivity_.intent(v.getContext())
47-
.name(data.location).address(locationCoord.address)
48-
.latitude(locationCoord.latitude).longitude(locationCoord.longitude)
49-
.address(locationCoord.address).start();
47+
.name(data.location)
48+
.address(locationCoord.address)
49+
.latitude(locationCoord.latitude)
50+
.longitude(locationCoord.longitude)
51+
.start();
5052
}
5153
});
5254
} else {

0 commit comments

Comments
 (0)