我已在我的应用程序中实现了搜索功能,但搜索不够清晰。
这意味着如果用户搜索其他用户,他需要例如输入完整的名字,但在某些情况下,字符在名字中间是外语,就像这个Du*š*an
一样,它会显示键入该字符后的数据,但如果大小写为John
,则需要键入John以获取某些结果。
我想在输入两个或三个字符后显示数据,并且我想在没有找到结果时清除列表。
还有一件事需要提及,我正在使用EditText
小部件进行搜索。
这是我的代码在java中的外观:
@Override
public void afterTextChanged(Editable s) {
if (!s.toString().isEmpty()) {
doSearch(s.toString());
} else {
// Probably here i need to clear list
mAdapter.notifyDataSetChanged();
}
}
现在这里是解析网络响应的方法:
private void doSearch(String query) {
// showLoadingDialog();
Map<String, String> params = new HashMap<>();
params.put("searchQuery", query);
mNetworkManager.sendPostRueqestWithoutAuthentication(
"http://192.168.42.6:8081/timster/include/Search.php",
volleySuccessListener,
volleyErrorListener,
params);
}
这就是我从DB获得JSON响应的方式:
private VolleyListenerSuccess volleySuccessListener = new VolleyListenerSuccess() {
@Override
public void getResult(String response) {
// dialog.dismiss();
mUsers = new ArrayList<>();
if (response.equalsIgnoreCase("no rows")) {
// TODO change recycler view state
// Here i should clear list too
mUsers.clear();
mAdapter.notifyDataSetChanged();
} else {
try {
JSONArray array = new JSONArray(response);
for (int i = 0; i < array.length(); i++) {
JSONObject object = array.getJSONObject(i);
User user = new User();
user.setName(object.getString("name"));
user.setImage(object.getString("image"));
mUsers.add(user);
}
mAdapter = new UserListAdapterV3(activity, mUsers);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setLayoutManager(new LinearLayoutManager(activity));
} catch (JSONException e) {
e.printStackTrace();
}
}
}
};
我也应该在这里改变一下吗? 这是服务器端代码(PHP):
<?php
if(isset($_POST['searchQuery']))
{
require_once('ConfigV2.php');
$search_query=$_POST['searchQuery'];
$sql = 'SELECT * FROM users WHERE MATCH(name) AGAINST(:search_query)';
$statement = $connection->prepare($sql);
$statement->bindParam(':search_query', $search_query, PDO::PARAM_STR);
$statement->execute();
if($statement->rowCount())
{
$row_all = $statement->fetchall(PDO::FETCH_ASSOC);
header('Content-type: application/json');
echo json_encode($row_all);
}
elseif(!$statement->rowCount())
{
echo "no rows";
}
}
?>
答案 0 :(得分:0)
如果在找不到结果时需要清除列表。您需要在PHP端更改代码。
echo "no rows";
到
echo json_encode([]);
如果要在MySQL中使用全文搜索,则需要对列
name
使用FULLTEXT索引