2015-06-10 1 views
0

Я работаю над приложением для Android. Приложение связывает данные с помощью json и ListAdpter в Listview. Теперь я хочу отфильтровать эти данные в соответствии с письмом пользователя в поле поиска. Я пытался это сделать, но из-за того, что несколько данных связаны в списке, и я не знаю, как его фильтровать. Ниже мой код:фильтрация в алфавитном порядке с помощью ListAdapter с использованием listview в приложении для Android

private void getdatalatlog(double latitude, double longitude) { 
    // TODO Auto-generated method stub 
    //value=5; 
    String url = "http://bizzcoder.co.in/php/comments.php?latitude='"+latitude+"'&longitude='"+longitude+"'&value='"+value+"'"; 
    aq.progress(R.id.progressBar1).ajax(url, JSONObject.class, this,"jsonCallback"); 

} 


public void jsonCallback(String url, JSONObject json, AjaxStatus status) { 


    if (json != null) { 

    List<String> city = new ArrayList<String>(); 
    mCommentList = new ArrayList<HashMap<String, String>>(); 

     Gson gson = new GsonBuilder().create(); 
     try { 

      JSONArray jsonResponse = json.getJSONArray("posts"); 
      city = gson.fromJson(jsonResponse.toString(),List.class); 
      for (int i = 0; i < jsonResponse.length(); i++) { 
       JSONObject c = jsonResponse.getJSONObject(i);  

       String title = c.getString(TAG_TITLE); 
       String content = c.getString(TAG_MESSAGE); 
       String username = c.getString(TAG_USERNAME); 
       String lat = c.getString(TAG_LATITUDE); 
       String log = c.getString(TAG_LONGITUDE); 
       String cont = c.getString(TAG_CONTACT); 

       // creating new HashMap 
       HashMap<String, String> map = new HashMap<String, String>(); 

       map.put(TAG_TITLE, title); 
       map.put(TAG_MESSAGE, content); 
       map.put(TAG_USERNAME, username); 
       map.put(TAG_LATITUDE, lat); 
       map.put(TAG_LONGITUDE, log); 
       map.put(TAG_CONTACT, cont); 
        // adding HashList to ArrayList 
      mCommentList.add(map); 


      } 
     } 
     catch (JSONException e) { 

      Toast.makeText(aq.getContext(), "Error in parsing JSON", Toast.LENGTH_LONG).show(); 
     } 
     catch (Exception e) { 
      Toast.makeText(aq.getContext(), "Something went wrong", Toast.LENGTH_LONG).show(); 
     } 

     ListAdapter adapter = new SimpleAdapter(this, mCommentList, 
       R.layout.single_post, new String[] { TAG_TITLE,TAG_USERNAME ,TAG_CONTACT ,TAG_MESSAGE ,TAG_LATITUDE , TAG_LONGITUDE 
         }, new int[] { R.id.shop_name,R.id.address,R.id.contact,R.id.distance,R.id.latitude,R.id.longitude }); 


     setListAdapter(adapter); 

     /** 
     * Enabling Search Filter 
     * */ 
     inputSearch.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
       // When user changed the Text 
       Shopdetail.this.adapter.getFilter().filter(cs); 
      } 

      @Override 
      public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
        int arg3) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void afterTextChanged(Editable arg0) { 
       // TODO Auto-generated method stub       
      } 
     }); 

     ListView lv = getListView();  
     lv.setOnItemClickListener(new OnItemClickListener() { 


      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 

       Intent intent = new Intent(); 
       Bundle b = new Bundle(); 


       String name= ((TextView) view.findViewById(R.id.shop_name)).getText().toString()+" , "+((TextView) view.findViewById(R.id.contact)).getText().toString(); 

       String lati= ((TextView) view.findViewById(R.id.latitude)).getText().toString(); 

       String longi= ((TextView) view.findViewById(R.id.longitude)).getText().toString(); 

       b.putString("shop",name); 
       b.putString("lati",lati); 
       b.putString("long",longi); 
       intent.setClass(Shopdetail.this, Mapview.class); 
       intent.putExtras(b); 
       startActivity(intent); 
      } 
     }); 
} 
    } 

Есть несколько деталей, связанных в ListView, как имя магазина, контактный номер телефона, адрес и т.д., я хочу, чтобы фильтровать только по названию магазина. но я красная линия ниже метода getfilter().

ответ

0

На самом деле я сделал это таким образом (EditText был на панели инструментов, но это может быть там, где когда-либо вы хотите):

  inputSearch = (EditText) findViewById(R.id.inputSearch); 
      inputSearch.addTextChangedListener(new TextWatcher() { 

       @Override 
       public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
        // When user changed the Text 
        adapter.getFilter().filter(cs.toString()); 
       } 

       @Override 
       public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
               int arg3) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void afterTextChanged(Editable arg0) { 
        // TODO Auto-generated method stub 
       } 
      }); 

Edit:

Для фильтрации пользовательских Базовый адаптер вы должны поставить этот в классе с адаптером:

List<Fanfic> fanfics; 
    private List<Fanfic>filteredData = null; 
    private ItemFilter mFilter = new ItemFilter(); 

Вам нужно 2 Lists - 1-й со всеми данными, 2-й с отфильтрованных данных

Во всех методах вы должны использовать filterData (в конструкторе, getCount, getItem, getItemId), а не отфильтрованные данные, которые вы просто заполняете конструктором.

Вот ItemFilter класс:

private class ItemFilter extends Filter { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 

      String filterString = constraint.toString().toLowerCase(); 

      FilterResults results = new FilterResults(); 

      final List<Fanfic> list = fanfics; 

      int count = list.size(); 
      final ArrayList<Fanfic> nlist = new ArrayList<Fanfic>(count); 

      String filterableString ; 

      for (int i = 0; i < count; i++) { 
       filterableString = list.get(i).getName(); 
       if (filterableString.toLowerCase().startsWith(filterString)) { 
        nlist.add(list.get(i)); 
       } 
      } 

      results.values = nlist; 
      results.count = nlist.size(); 

      return results; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      filteredData = (ArrayList<Fanfic>) results.values; 
      notifyDataSetChanged(); 
     } 

    } 

И добавить этот метод адаптера:

public Filter getFilter() { 
    return mFilter; 
} 

и последняя вещь, вы должны реализовать Фильтруемый.

+0

На самом деле я получил ошибку в адаптере, потому что я использовал метод listadpter и getfilter, чтобы дать ошибку с помощью listadpter. – user4417231

+0

Я не уверен, что это возможно с ListAdapter. Почему вы не используете базовый адаптер Castom? Чтобы получить те же результаты, что и в ListAdapter, вы получаете не более 5 минут. Я отредактирую для вас свой пост с кодом, который вам нужно добавить в адаптер для фильтра – tarasmorskyi

+0

Я хочу связать несколько данных в списке, поэтому я использовал ListAdapter. и я не могу его изменить. – user4417231