2017-03-18 11 views
0

Ich habe ein Problem. Ich möchte meine Listenansicht mit SearchView oder EditText durchsuchen und meine Elemente filtern, wenn jemand etwas Text eingibt. Aber ich finde die richtige Antwort hier nicht, da meine JSON-Datei aus einer PHP/MySQL-Datenbank stammt. Kann mir jemand helfen ?Android Listview Suche Json

Hier ist mein Code

public class MainActivity extends AppCompatActivity implements ListView.OnItemClickListener { 
private ListView listView; 
private String JSON_STRING; 
EditText et; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    listView = (ListView) findViewById(R.id.listView); 
    listView.setOnItemClickListener(this); 
    listView.smoothScrollToPosition(0); 
    listView.setTextFilterEnabled(true); 
    et = (EditText) findViewById(R.id.editText2); 
    getJSON(); 

    } 

private void showEmployee() { 
    JSONObject jsonObject = null; 
    final ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>(); 
    try { 
     jsonObject = new JSONObject(JSON_STRING); 
     final JSONArray result = jsonObject.getJSONArray(Config.TAG_JSON_ARRAY); 

     for (int i = 0; i < result.length(); i++) { 
      JSONObject jo = result.getJSONObject(i); 
      String id = jo.getString(Config.TAG_ID); 
      String kfz = jo.getString(Config.TAG_KFZ); 
      String bland = jo.getString(Config.TAG_BLAND); 
      String kreis = jo.getString(Config.TAG_KREIS); 

      HashMap<String, String> employees = new HashMap<>(); 
      employees.put(Config.TAG_ID, id); 
      employees.put(Config.TAG_KFZ, kfz); 
      employees.put(Config.TAG_BLAND, bland); 
      employees.put(Config.TAG_KREIS, kreis); 
      list.add(employees); 
     } 


    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    final ListAdapter adapter = new SimpleAdapter(
      MainActivity.this, list, R.layout.list_item, 
      new String[]{Config.TAG_KFZ, Config.TAG_KREIS}, 
      new int[]{R.id.kfz, R.id.kreis}); 

    listView.setAdapter(adapter); 


} 

private void getJSON(){ 
    class GetJSON extends AsyncTask<Void,Void,String> { 

     ProgressDialog loading; 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      loading = ProgressDialog.show(MainActivity.this,"Suche KFZ Kennzeichen","Warten...",false,false); 

     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
      loading.dismiss(); 
      JSON_STRING = s; 
      showEmployee(); 
     } 

     @Override 
     protected String doInBackground(Void... params) { 
      RequestHandler rh = new RequestHandler(); 
      String s = rh.sendGetRequest(Config.URL_GET_ALL); 

      return s; 
     } 
    } 
    GetJSON gj = new GetJSON(); 
    gj.execute(); 
} 

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    Intent intent = new Intent(this, KfzDetails.class); 
    HashMap<String,String> map =(HashMap)parent.getItemAtPosition(position); 
    String kfzid = map.get(Config.TAG_ID).toString(); 
    intent.putExtra(Config.EMP_ID,kfzid); 
    startActivity(intent); 
} 

}

Antwort

0

Oh ich eine Lösung für SimpleAdapter fand

SimpleAdapter mAdapter; // zunächst

als

final SimpleAdapter mAdapter = new SimpleAdapter(
      MainActivity.this,list, R.layout.list_item, 
      new String[]{Config.TAG_KFZ, Config.TAG_KREIS}, 
      new int[]{R.id.kfz, R.id.kreis}); 

    listView.setAdapter(mAdapter); 

    et.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      mAdapter.getFilter().filter(s); 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 

     } 
    }); 

Der Filter läuft, aber es ist meine Einträge duplizieren Wie kann ich fix das, oder besser, wie kann ich für KFZ suchen und nicht für Kreis

+0

dies Wie 'SimpleAdapter' seinen' Filter' implementiert, wie ich bereits sagte, müssen Sie einen anderen 'Adapter' verwenden, versuchen Sie einen benutzerdefinierten Adapter wie:' class Adapter extends' [MatchableArrayAdapter] (https://gist.github.com/pskink/2dd4d17a93caf02ff696533e82f952b0) ' {...' und überschreibt die Methoden 'onBind' und 'matches' – pskink