2017-11-15 2 views
0

Ich versuche, TextChangedListener zu verwenden, um Suchfunktionalität auf meinem ListView zu implementieren. Aber nach dem Hinzufügen eines Zeichens in EditText; Die ListView wird leer. Ich habe eine Filtermethode in meiner ArrayAdapter-Klasse implementiert.ListView-Suche funktioniert nicht

Ich bekomme meine Daten von JSON.

Hier ist mein Code:

UserList.java

public class UserList extends AppCompatActivity { 

private ListView listView; 
private ArrayList<MyDataModel> list; 
private MyArrayAdapter adapter; 
private EditText search; 

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

    search = (EditText) findViewById(R.id.search); 

    //Array List for Binding Data from JSON to this List 
    list = new ArrayList<>(); 

    //Binding that List to Adapter 
    adapter = new MyArrayAdapter(this, list); 

    //Getting List and Setting List Adapter 
    listView = (ListView) findViewById(R.id.listView); 
    listView.setAdapter(adapter); 

    listView.setTextFilterEnabled(true); 
    search.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) { 

      String text = search.getText().toString().toLowerCase(Locale.getDefault()); 
      adapter.filter(text); 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
     } 
    }); 


    //Checking Internet Connection 
    if (InternetConnection.checkConnection(getApplicationContext())) { 
     new GetDataTask().execute(); 
    } else { 
     Snackbar.make(findViewById(R.id.parentLayout),"Internet Connection Not Available", Snackbar.LENGTH_LONG).show(); 
    } 
} 

//Creating Get Data Task for Getting Data From Web 
class GetDataTask extends AsyncTask<Void, Void, Void> { 

    ProgressDialog dialog; 
    int jIndex; 
    int x; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     //Progress Dialog for User Interaction 
     x=list.size(); 

     if(x==0) 
      jIndex=0; 
     else 
      jIndex=x; 

     dialog = new ProgressDialog(UserList.this); 
     dialog.setTitle("Please Wait..."+x); 
     dialog.setMessage("Retrieving Data"); 
     dialog.show(); 

    } 

    @Nullable 
    @Override 
    protected Void doInBackground(Void... params) { 

     //Getting JSON Object from Web Using okHttp 
     JSONObject jsonObject = JSONParser.getDataFromWeb(); 

     try { 

      if (jsonObject != null) { 

       if(jsonObject.length() > 0) { 

        JSONArray array = jsonObject.getJSONArray(Keys.KEY_CONTACTS); 

        //Check Length of Array... 
        int lenArray = array.length(); 
        if(lenArray > 0) { 
         for(; jIndex < lenArray; jIndex++) { 

          //Creating Every time New Object and adding to List 
          MyDataModel model = new MyDataModel(); 

          JSONObject innerObject = array.getJSONObject(jIndex); 
          String name = innerObject.getString(Keys.KEY_NAME); 

          model.setName(name); 
          list.add(model); 
         } 
        } 
       } 
      } else { 

      } 
     } catch (JSONException je) { 
      Log.i(JSONParser.TAG, "" + je.getLocalizedMessage()); 
     } 
     return null; 
    } 


    @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 
     dialog.dismiss(); 

     //Checking if List size if more than zero then update ListView 
     if(list.size() > 0) { 
      adapter.notifyDataSetChanged(); 

     } else { 
      Snackbar.make(findViewById(R.id.parentLayout), "No Data Found", Snackbar.LENGTH_LONG).show(); 
     } 

    } 
} 
} 

ich die Filtermethode in meiner ArrayAdapter Klasse implementiert haben.

Hier ist meine ArrayAdapter Klasse:

MyArrayAdapter.java

public class MyArrayAdapter extends ArrayAdapter<MyDataModel> implements Filterable{ 

List<MyDataModel> modelList; 
Context context; 
private LayoutInflater mInflater; 
private ArrayList<MyDataModel> arrayList; 

public MyArrayAdapter(Context context, List<MyDataModel> objects) { 
    super(context, 0, objects); 
    this.context = context; 
    this.mInflater = LayoutInflater.from(context); 
    modelList = objects; 

    this.arrayList = new ArrayList<MyDataModel>(); 
    this.arrayList.addAll(modelList); 
} 

@Override 
public MyDataModel getItem(int position) { 
    return modelList.get(position); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    final ViewHolder vh; 
    if (convertView == null) { 
     View view = mInflater.inflate(R.layout.layout_row_view, parent, false); 
     vh = ViewHolder.create((RelativeLayout) view); 
     view.setTag(vh); 
    } else { 
     vh = (ViewHolder) convertView.getTag(); 
    } 

    MyDataModel item = getItem(position); 

    vh.textViewName.setText(item.getName()); 
    return vh.rootView; 
} 


private static class ViewHolder { 
    public final RelativeLayout rootView; 

    public final TextView textViewName; 

    private ViewHolder(RelativeLayout rootView, TextView textViewName) { 
     this.rootView = rootView; 
     this.textViewName = textViewName; 
    } 

    public static ViewHolder create(RelativeLayout rootView) { 
     TextView textViewName = (TextView) rootView.findViewById(R.id.textViewName); 
     return new ViewHolder(rootView, textViewName); 
    } 
} 

// Filter Class 
public void filter(String charText) { 
    charText = charText.toLowerCase(Locale.getDefault()); 
    modelList.clear(); 
    if (charText.length() == 0) { 
     modelList.addAll(arrayList); 
    } else { 
     for (MyDataModel wp : arrayList) { 
      if (wp.getName().toLowerCase(Locale.getDefault()).contains(charText)) { 
       modelList.add(wp); 
      } 
     } 
    } 
    notifyDataSetChanged(); 
} 

Antwort

0

Aufruf Suchfunktion von aftertTexChange

search.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) { 

    } 

    @Override 
    public void afterTextChanged(Editable s) { 
     // i have updated this 
     String text = e.toString().toLowerCase(Locale.getDefault()); 
     adapter.filter(text); 
    } 
}); 

jetzt Ihre Suchmethode möchte diese

public void filter(String charText) { 
charText = charText.toLowerCase(Locale.getDefault()); 
modelList.clear(); 
// add this one here 
notifyDataSetChanged(); 

if (charText.length() == 0) { 
    modelList.addAll(arrayList); 
} else { 
    // change this for loop 
    for (int i = 0; i< arrayList.size(); i++) { 
     if (arrayList.get(i).getName().toLowerCase(Locale.getDefault()).contains(charText)) { 
      modelList.add(arrayList.get(i)); 
     } 
    } 
} 
notifyDataSetChanged(); 
} 
+0

Ich habe versucht, Ihren Code zu verwenden; aber es funktioniert immer noch nicht –

+0

Können Sie alle Elemente erhalten, wenn charText.lenght() == 0? –

+0

Ändern Sie zuerst this.arrayList = new ArrayList (); this.arrayList.addAll (modelList); 'zu' this.arrayList = new ArrayList (); this.arrayList.addAll (Objekte); 'then' für (int i = 0; i