Php SearchView总是给出前几个json值的值
下面是我的搜索活动Php SearchView总是给出前几个json值的值,php,android,json,Php,Android,Json,下面是我的搜索活动 public class SearchActivity extends AppCompatActivity { // CONNECTION_TIMEOUT and READ_TIMEOUT are in milliseconds public static final int CONNECTION_TIMEOUT = 10000; public static final int READ_TIMEOUT = 15000; private Sim
public class SearchActivity extends AppCompatActivity {
// CONNECTION_TIMEOUT and READ_TIMEOUT are in milliseconds
public static final int CONNECTION_TIMEOUT = 10000;
public static final int READ_TIMEOUT = 15000;
private SimpleCursorAdapter myAdapter;
SearchView searchView = null;
private WarehouseSalesDetails[] strArrData;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.search_item);
Toolbar toolBarSearch = (Toolbar)findViewById(R.id.toolbarSearch);
setSupportActionBar(toolBarSearch);
final String[] from = new String[]{"title"};
final int[] to = new int[]{android.R.id.text1};
//setup SimpleCursorAdapter
myAdapter = new SimpleCursorAdapter(SearchActivity.this,android.R.layout.simple_spinner_dropdown_item,null,from,to,
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
new RetrieveWarehouseSalesTask(this).execute();
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
getMenuInflater().inflate(R.menu.menu_search,menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchManager searchManager = (SearchManager)SearchActivity.this.getSystemService(Context.SEARCH_SERVICE);
if(searchItem!=null){
searchView = (SearchView) searchItem.getActionView();
}
if(searchView!=null){
searchView.setSearchableInfo(searchManager.getSearchableInfo(SearchActivity.this.getComponentName()));
searchView.setIconified(false);
searchView.setSuggestionsAdapter(myAdapter);
//getting selected on item suggestion
searchView.setOnSuggestionListener(new SearchView.OnSuggestionListener(){
@Override
public boolean onSuggestionClick(int position){
//Add clicked text to search box
CursorAdapter ca = searchView.getSuggestionsAdapter();
Cursor cursor = ca.getCursor();
cursor.moveToPosition(position);
searchView.setQuery(cursor.getString(cursor.getColumnIndex("title")),false);
Log.d("strArr id",strArrData[position].id);
String selectedID = strArrData[position].id;
Intent intent = new Intent(SearchActivity.this,RetrieveIndividualWarehouseSales.class);
intent.putExtra("pid",selectedID);
startActivity(intent);
return true;
}
@Override
public boolean onSuggestionSelect(int position){
return true;
}
});
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){
@Override
public boolean onQueryTextSubmit(String s){
return false;
}
@Override
public boolean onQueryTextChange(String s){
//filter data
final MatrixCursor mc = new MatrixCursor(new String[]{
BaseColumns._ID,"title"
});
for(int i = 0; i<strArrData.length; i++){
if(strArrData[i].title.toLowerCase().startsWith(s.toLowerCase())){
mc.addRow(new Object[]{i,strArrData[i].id});
}
}
myAdapter.changeCursor(mc);
return false;
}
});
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
return super.onOptionsItemSelected(item);
}
@Override
protected void onNewIntent(Intent intent){
if(Intent.ACTION_SEARCH.equals(intent.getAction())){
String query = intent.getStringExtra(SearchManager.QUERY);
if(searchView!=null){
searchView.clearFocus();
}
}
}
class RetrieveWarehouseSalesTask extends AsyncTask<Void,Void,Void> {
private String TAG = ActiveWarehouseSalesFragment.RetrieveWarehouseSalesTask.class.getSimpleName();
private String TAG_PID = "pid";
public ProgressDialog pDialog;
private Context context;
//URL to get JSON details
private String url = "http://www.example.com/abc.php";
ArrayList<HashMap<String,String>> sales_details;
List<WarehouseSalesDetails> data = new ArrayList<>();
JSONObject jsonObj;
String jsonStr;
JSONArray sales;
//for recycler view
private RecyclerView warehouse_recycler;
private AdapterRecycler mAdapter;
public RetrieveWarehouseSalesTask(Context context){
this.context = context;
sales_details = new ArrayList<>();
}
@Override
protected void onPreExecute(){
super.onPreExecute();
pDialog = new ProgressDialog(context);
pDialog.setMessage("Searching...");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected Void doInBackground(Void... arg0){
HttpHandler sh = new HttpHandler();
//making a request to URL and getting response
jsonStr = sh.makeServiceCall(url);
Log.e(TAG, "Response from url (SearchActivity): " + jsonStr);
return null;
}
@Override
protected void onPostExecute(Void result){
//ArrayList<String> dataList = new ArrayList<String>();
super.onPostExecute(result);
if(pDialog.isShowing()){
pDialog.dismiss();
}
if(jsonStr != null){
try{
jsonObj = new JSONObject(jsonStr);
//Getting JSON Array Node
sales = jsonObj.getJSONArray("Result");
//looping through all results
for(int i = sales.length() - 1; i >= 0 ;i--){
JSONObject s = sales.getJSONObject(i);
WarehouseSalesDetails wsd = new WarehouseSalesDetails();
wsd.id = s.getString("id");
wsd.company_name = s.getString("company_name");
wsd.promotion_image= s.getString("promotion_image");
wsd.title = s.getString("title");
wsd.promotional_period = s.getString("promotional_period");
wsd.viewCount = s.getString("view_count");
data.add(wsd);
}
//strArrData = dataList.toArray(new String[dataList.size()]);
strArrData = data.toArray(new WarehouseSalesDetails[data.size()]);
Log.d("TAG",sales_details.toString());
}catch(final JSONException e){
Log.e(TAG, "JSON parsing error: " + e.getMessage());
}
}else{
Log.e(TAG,"Couldn't get json from server");
}
}
}
}
公共类SearchActivity扩展了AppCompatActivity{
//连接超时和读取超时以毫秒为单位
公共静态最终int连接\u超时=10000;
公共静态最终整型读取超时=15000;
私有SimpleCursorAdapter-myAdapter;
SearchView SearchView=null;
私人仓库销售详情[]数据;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.search_项);
工具栏工具栏搜索=(工具栏)findViewById(R.id.toolBarSearch);
设置支持操作栏(工具栏搜索);
最终字符串[]from=新字符串[]{“title”};
final int[]to=new int[]{android.R.id.text1};
//设置SimpleCorsorAdapter
myAdapter=new SimpleCursorAdapter(SearchActivity.this,android.R.layout.simple\u微调器\u下拉菜单\u项,null,from,to,
游标适配器。标志(寄存器、内容、观察者);
新建RetrieveWarehouseSalesTask(this.execute();
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(右菜单。菜单搜索,菜单);
MenuItem searchItem=menu.findItem(R.id.action\u search);
SearchManager SearchManager=(SearchManager)SearchActivity.this.getSystemService(Context.SEARCH\u服务);
if(searchItem!=null){
searchView=(searchView)searchItem.getActionView();
}
if(searchView!=null){
searchView.setSearchableInfo(searchManager.getSearchableInfo(SearchActivity.this.getComponentName());
searchView.setIconified(false);
searchView.setSuggestionAdapter(myAdapter);
//正在根据项目建议进行选择
searchView.setOnSuggestionListener(新的searchView.OnSuggestionListener(){
@凌驾
公共布尔onSuggestionClick(整数位置){
//将单击的文本添加到搜索框
CursorAdapter ca=searchView.GetSuggestionAdapter();
Cursor=ca.getCursor();
光标。移动位置(位置);
searchView.setQuery(cursor.getString(cursor.getColumnIndex(“title”)),false);
Log.d(“strArr id”,strArrData[position].id);
字符串selectedID=strArrData[position].id;
意向意向=新意向(SearchActivity.this,RetrieveIndividualWarehouseSales.class);
intent.putExtra(“pid”,选择EDID);
星触觉(意向);
返回true;
}
@凌驾
公共布尔值onSuggestionSelect(整数位置){
返回true;
}
});
searchView.setOnQueryTextListener(新的searchView.OnQueryTextListener(){
@凌驾
公共布尔值onQueryTextSubmit(字符串s){
返回false;
}
@凌驾
公共布尔值onQueryTextChange(字符串s){
//过滤数据
最终MatrixCursor mc=新MatrixCursor(新字符串[]){
BaseColumns.\u ID,“标题”
});
对于(int i=0;i=0;i--){
JSONObject s=sales.getJSONObject(i);
WarehouseSalesDetails wsd=新WarehouseSalesDetails();
wsd.id=s.getString(“id”);
wsd.company_name=s.getString(“company_name”);
wsd.promotion\u image=s.getString(“promotion\u image”);
wsd.title=s.getString(“title”);
wsd.promotional_period=s.getString(“promotional_period”);
wsd.viewCount=s.getString(“视图计数”);
data.add(水务署);
}
//strArrData=dataList.toArray(新字符串[dataList.size()]);
strArrData=data.toArray(新仓库SalesDetails[data.size()]);
Log.d(“TAG”,sales_details.toString());
}捕获(最终JSONException e){
Log.e(标记“JSON解析错误:”+e.getMessage());
}
}否则{
Log.e(标记“无法从服务器获取json”);
}
}
}
}
当我将内容写入搜索框时,它会正确过滤,但过滤后,如果我单击任何项目,它总是在同一位置打开上一个项目的值。这些值始终是json值的前几个值。我应该如何解决此问题?给你
您在建议侦听器中获得的位置与相应的搜索查询结果集相对应。您不能使用相同的位置
CursorAdapter ca = searchView.getSuggestionsAdapter();
Cursor cursor = ca.getCursor();
If (cursor.moveToPosition(position)) {
String selectedID = cursor.getString(cursor.getColumnIndex("id");
searchView.setQuery(cursor.getString(cursor.getColumnIndex("title")),false);
Log.d("strArr id",strArrData[position].id);
Intent intent = new Intent(SearchActivity.this,RetrieveIndividualWarehouseSales.class);
intent.putExtra("pid",selectedID);
startActivity(intent);
}
出现此错误android.database.CursorIndexOutOfBoundsException:请求的列:-1,#个列:2My bad。这应该是标题而不是id。String selectedID=cursor.getString(cursor.getColumnIndex(“标题”);selectedID是标题的值而不是id