2015-09-29 3 views
4

Я сделал свою долю исследований и нашел три случая, связанных с моей проблемой.Фильтр поиска по списку отображает неправильные результаты по элементу нажмите

Solution 1

Solution 2

Solution 3

Я не говорю, что мой случай уникален, или что-нибудь, это закон, что я не могу их ответы работать для меня с моим шнуром.

ПРОБЛЕМА: У меня есть listview получать фильтруется edit text на top.However, когда я нажимаю на пункт искал я получить результат другого изображения будучи selected.Text отлично работает, но изображения является проблемой.

Например: список содержит строки с изображениями A, B, C, D

О поиске C вы получите результат фильтрованную, как C.But щелкнув по нему результаты на показ изображения с A.It, как позиция не изменяется для изображений, но использует исходное положение адаптера ArrayList.

Любая помощь будет оценена по достоинству.

Мой адаптер:

public class SearchListAdapter extends BaseAdapter implements Filterable { 
 
    List<Model> mStringFilterList; 
 
    ValueFilter valueFilter; 
 
    ImageLoader imageLoader = AppController.getInstance().getImageLoader(); 
 
    private Activity activity; 
 
    private LayoutInflater inflater; 
 
    private List<Model> modelItems; 
 
    private int mDefaultImageId; 
 

 
    public SearchListAdapter(Activity activity, List<Model> modelItems) { 
 
     this.activity = activity; 
 
     this.modelItems = modelItems; 
 
     mStringFilterList = modelItems; 
 
    } 
 

 

 
    public void setDefaultImageResId(int defaultImage) { 
 
     mDefaultImageId = defaultImage; 
 
    } 
 

 
    @Override 
 
    public int getCount() { 
 
     return modelItems.size(); 
 
    } 
 

 
    @Override 
 
    public Object getItem(int location) { 
 
     return modelItems.get(location); 
 
    } 
 

 
    @Override 
 
    public long getItemId(int position) { 
 
     return position; 
 
    } 
 

 
    @Override 
 
    public View getView(int position, View convertView, ViewGroup parent) { 
 

 
     if (inflater == null) 
 
      inflater = (LayoutInflater) activity 
 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
 
     if (convertView == null) 
 
      convertView = inflater.inflate(R.layout.search_list_row, null); 
 

 
     if (imageLoader == null) 
 
      imageLoader = AppController.getInstance().getImageLoader(); 
 
     NetworkImageView thumbNail = (NetworkImageView) convertView 
 
       .findViewById(R.id.thumbnail); 
 
     TextView title = (TextView) convertView.findViewById(R.id.title); 
 
     TextView rating = (TextView) convertView.findViewById(R.id.rating); 
 
     TextView genre = (TextView) convertView.findViewById(R.id.genre); 
 

 
     Model m = modelItems.get(position); 
 

 
     // thumbnail image 
 
     thumbNail.setImageUrl(m.getThumbnailUrl(), imageLoader); 
 
     thumbNail.setTag(position); 
 
     // title 
 
     title.setText(m.getTitle()); 
 

 
     // amount 
 
     rating.setText(String.valueOf(m.getRating())); 
 

 
     // description 
 
     String genreStr = ""; 
 
     for (String str : m.getGenre()) { 
 
      genreStr += str + ", "; 
 
     } 
 
     genreStr = genreStr.length() > 0 ? genreStr.substring(0, 
 
       genreStr.length() - 2) : genreStr; 
 
     genre.setText(genreStr); 
 

 
     return convertView; 
 
    } 
 

 
    @Override 
 
    public Filter getFilter() { 
 
     if (valueFilter == null) { 
 
      valueFilter = new ValueFilter(); 
 
     } 
 
     return valueFilter; 
 
    } 
 

 
    private class ValueFilter extends Filter { 
 
     @Override 
 
     protected FilterResults performFiltering(CharSequence constraint) { 
 
      FilterResults results = new FilterResults(); 
 
      if (constraint != null && constraint.length() > 0) { 
 
       ArrayList<Model> filterList = new ArrayList<Model>(); 
 
       for (int i = 0; i < mStringFilterList.size(); i++) 
 
        if ((mStringFilterList.get(i).getTitle().toUpperCase()) 
 
          .contains(constraint.toString().toUpperCase())) { 
 

 

 
         Model m = new Model(mStringFilterList.get(i) 
 
           .getTitle(), mStringFilterList.get(i) 
 
           .getThumbnailUrl(), mStringFilterList.get(i) 
 
           .getRating(), mStringFilterList.get(i) 
 
           .getGenre()); 
 

 
         filterList.add(m); 
 
        } 
 
       results.count = filterList.size(); 
 
       results.values = filterList; 
 
      } else { 
 
       results.count = mStringFilterList.size(); 
 
       results.values = mStringFilterList; 
 
      } 
 
      return results; 
 

 
     } 
 

 
     @Override 
 
     protected void publishResults(CharSequence constraint, 
 
             FilterResults results) { 
 
      modelItems = (List<Model>) results.values; 
 
      notifyDataSetChanged(); 
 
     } 
 

 
    } 
 

 
}

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
 
      @Override 
 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
 
       String name = ((TextView) view.findViewById(R.id.title)) 
 
         .getText().toString(); 
 
       bitmap = ((Model) modelList.get(position)).getThumbnailUrl(); 
 
       String rate = ((TextView) view.findViewById(R.id.rating)) 
 
         .getText().toString(); 
 
       String genres = ((TextView) view.findViewById(R.id.genre)) 
 
         .getText().toString(); 
 

 
       Intent intent = new Intent(SearchActivity.this, Details.class); 
 
       intent.putExtra(Title, name); 
 
       intent.putExtra("images", bitmap); 
 
       intent.putExtra(Rate, rate); 
 
       intent.putExtra(Genre, genres); 
 

 
       startActivity(intent); 
 
      } 
 
     }); 
 
    }

OnItemclickListener:

+0

где вы инициализация вашего ListView и установив свой arrayadapter на вашем ListView? И где ваш элемент списка listview? –

+0

У вас есть личный список modelItems' в вашем адаптере, но используйте 'modelList.get (position)' в слушателе, почему это? Что такое 'modelList'? Это внутренний список адаптеров, который обновляется, и именно там вы должны взять свой товар из – wasyl

ответ

5

Вы можете изменить код

String name = ((TextView) view.findViewById(R.id.title)).getText().toString(); 
bitmap = ((Model) modelList.get(position)).getThumbnailUrl(); 
String rate = ((TextView) view.findViewById(R.id.rating)).getText().toString(); 
String genres = ((TextView) view.findViewById(R.id.genre)).getText().toString(); 

в

Model model=(Model)adapter.getItem(position); 

Он получит модель, на которой вы щелкнули положение и передать эту модель как Serialized или то, что вы хотите сделать.

Надеюсь, это решит проблему.

+0

и не забудьте добавить-> @Override public Object getItem (int location) { return modelItems.get (location); } в адаптере – Rasel

5

использование

Model model = (Model) parent.getItemAtPosition(position); 

, чтобы извлечь элемент из вашего набора данных и использовать эту ссылку, чтобы заполнить объект Intent. После того, как вы фильтруете элементы в своем адаптере, вы переопределяете modelItems = (List<Model>) results.values; текущую ссылку modelItems.

Редактировать

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

      Model model = (Model) parent.getItemAtPosition(position); 
      Intent intent = new Intent(SearchActivity.this, Details.class); 
      intent.putExtra(Title, model.getTitle()); 
      intent.putExtra("images", model.getThumbnailUrl()); 
      intent.putExtra(Rate, String.valueOf(model.getRating())); 
      intent.putExtra(Genre, model.getGenre()); 

      startActivity(intent); 
     } 
    }); 
} 
+0

. Хорошо, я пытаюсь выяснить, где первый код, который вы мне дали, идет ... искупить, новичок много. –

+0

Если я удалю другие строки, как я покажу элементы в другом действии? –

+0

Onitemclick в моей деятельности –

1

Проблема заключается в том onClickListener возвращается position=0, когда onClick, потому что в вашем фильтруется ListView он имеет только один элемент Cindex=0 где индекс Нулевое относится к image A, Вот почему его отображающее A image см это для Ваше решение: Get Original Index from Filtered list view

+0

Я проверил этот пример .. Очень просто понять. Но я не мог понять, где он достигает того, чего я не могу выполнить. Однако я благодарен за ваше предложение +1. –

2

Кажется, что вы фильтруете свой адаптер, но затем получаете предмет из своего первоначального нефильтрованного списка. Вы должны получить предмет непосредственно от вашего адаптера. Добавьте следующий метод к вашему BaseAdapter:

public Model getItemAtPosition(int position) 
{ 
    return model.get(position); 
} 

и называют, что с вашей OnItemClickListener реализации:

bitmap = adapter.getItemAtPosition(position).getThumbnailUrl();

+0

Это мое предпочтительное решение, очень чистое и эффективное. –

Смежные вопросы