2017-11-12 2 views
1

TextChangedListener를 사용하여 ListView에서 검색 기능을 구현하려고합니다. 그러나 EditText에서 일부 문자를 추가 한 후; ListView가 비어있게됩니다. 내 ArrayAdapter 클래스에 필터 메서드를 구현했습니다.TextChangedListener가 아무 것도하지 않음

JSON에서 데이터를 가져오고 있습니다. 내 ArrayAdapter와 클래스의 필터 방법을 구현 한

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(); 
     } 

    } 
} 
} 

UserList.java :

여기 내 코드입니다.

MyArrayAdapter.java 당신은 데이터를 필터링 한 번 더 arryList를 만들 필요가

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(); 
} 
+0

을 기준으로 비교해야 할 방법은? modelList에는 항목이 있습니까? – kimkevin

+0

charText.length() == 0 일 때 모든 항목을 얻습니다. –

답변

1

:

여기 내 ArrayAdapter와 클래스입니다.

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); 
} 

이제 필터에 당신은 당신이 필터 방법에 대한 디버깅이 있었나요 ArrayList를

// 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(); 
} 
+0

해결책을 시도했지만 여전히 작동하지 않습니다. –

+0

질문에 최신 코드 업데이트 –

+0

코드를 업데이트했습니다. –