2015-11-04 92 views
2

我一直在试图实现一个简单的搜索listview,我已经能够使用排序填充,但都没有效果,直到日期。感谢@Dhaval Patel谁一直在迎接帮助。但我现在遇到的问题是,当我搜索时,的ListView拒绝改变内容从而使他们的搜索程序中的使用BaseAdapter的ListView搜索功能不填充搜索列表

下面无用的是我的代码:

public class MainActivity extends Activity { 

    private ListView mList; 
    private List<Movie> movieList = new ArrayList<Movie>(); 
    EditText inputSearch; 


    protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
      setContentView(R.layout.activity_main); 

     mList = (ListView) findViewById(R.id.list); 
     inputSearch = (EditText) findViewById(R.id.inputSearch); 


      adapter = new CustomListAdapter(this, movieList); 
      mList.setAdapter(adapter); 


     //SEARCH TEXTCHANGE 
     inputSearch.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
        // When user changed the Text 
        MainActivity.this.adapter.getFilter().filter(cs.toString()); 
       //FLAGS Cannot resolve method 'getFilter()' here 
       } 

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




    } 



} 

而且这是代码在我的CustomListAdapter类

public class CustomListAdapter extends BaseAdapter { 

    private Activity activity; 
    private LayoutInflater inflater; 
    private List<Movie> movieItems; 
    private String[] bgColors; 
    private List<String>originalData = null; 
    private List<String>filteredData = null; 
    private ItemFilter mFilter = new ItemFilter(); 
     ImageLoader imageLoader = MyApplication.getInstance().getImageLoader(); 


     public CustomListAdapter(Activity activity, List<Movie> movieItems) { 
      this.activity = activity; 
      this.movieItems = movieItems; 
      bgColors = activity.getApplicationContext().getResources().getStringArray(R.array.movie_serial_bg); 
     } 
     @Override 
     public int getCount() { 
       return movieItems.size(); 
     } 

     @Override 
     public Object getItem(int location) { 
      return movieItems.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.list_row_image, null); 

      if (imageLoader == null) 
       imageLoader = MyApplication.getInstance().getImageLoader(); 
      NetworkImageView thumbNail = (NetworkImageView) convertView.findViewById(R.id.thumbnail); 

      TextView serial = (TextView) convertView.findViewById(R.id.serial); 
      TextView title = (TextView) convertView.findViewById(R.id.title); 
      TextView rating = (TextView) convertView.findViewById(R.id.rating); 
      TextView genre = (TextView) convertView.findViewById(R.id.genre); 
      TextView year = (TextView) convertView.findViewById(R.id.releaseYear); 

      // getting movie data for the row 
      Movie m = movieItems.get(position); 

      // thumbnail image 
      thumbNail.setImageUrl(m.getThumbnailUrl(), imageLoader); 

      // title 
      title.setText(m.getTitle()); 

      // rating 
      rating.setText("Rating: " + String.valueOf(m.getRating())); 

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

      // release year 
      year.setText(String.valueOf(m.getYear())); 

      String color = bgColors[position % bgColors.length]; 
      serial.setBackgroundColor(Color.parseColor(color)); 




      return convertView; 
    } 



    public Filter getFilter() { 
     return mFilter; 
    } 

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

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

     FilterResults results = new FilterResults(); 

     final List<String> list = originalData; 

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

     String filterableString ; 

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

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

     return results; 
    } 

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

} 



} 

所以有人可以告诉我什么我不正确。 在此先感谢

+0

如果你使用Filter类,我确定我可以很容易地解决你的问题,请等待,当我可以找到它更容易使用过滤器比自己做。 – Nanoc

+0

我能解决这个问题,但注意到我在这里发布的另一个问题http://stackoverflow.com/questions/33529720/can-not-reload-listview-content-after-implementing-filterable-interface-on-my -cu –

回答

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

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

    FilterResults results = new FilterResults(); 

    final List<Movie> list = movieItems; 

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

    String filterableString ; 

    for (int i = 0; i < count; i++) { 
     filterableString = list.get(i).getName(); 
     if (filterableString.toLowerCase().contains(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) { 
    movieItems= (ArrayList<String>) results.values; 
    notifyDataSetChanged(); 
} 

} 
+0

Hi @jily - 我更换了** filterableString = list.get(i).getName(); **与 ** filterableString = list.get(i).getTitle(); ** 但是程序在** nlist.add(filterableString)上的标志; ** ERROR ::'add(com.npi.blureffect.model.Movie)'in'java.util.ArrayList''can not apply to'(java.lang。字符串)' –

+0

hi @OkechukwuEze ...添加电影对象到nlist ...我编辑了代码..检查出来。 – jily

+0

我不敢相信我终于解决了这个搜索难题。感谢你和@sonic 但是我意识到,在搜索后,当我清除EditView搜索数据时,该列表不会填充以前的内容**,而是只保留搜索结果结果.. 你知道我清除EditView数据后如何恢复ListView与其预先的内容? –

1

看起来你没有在适配器中使用filteredData。 因此,当您拨打notifiyDataSetChanged时,填写ListView的数据使用量没有变化。

publishResults方法应该更改用于填充视图的数据,即为您的movieItems列表。

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

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

     FilterResults results = new FilterResults(); 

     final List<Movie> list = originalMovieItems; 

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

     String filterableString ; 

     for (int i = 0; i < count; i++) { 
      filterableString = list.get(i).getName();//or whatever you want to filter on 
      if (filterableString.toLowerCase().contains(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) { 
     movieList = (ArrayList<Movie>) results.values; 
     notifyDataSetChanged(); 
    } 

} 

因此,为了保持影片名单不变(不是你显示一个,但你过滤的一个),你应该在originalMovieList字段添加到您的适配器类,并修改构造如下。

public CustomListAdapter(Activity activity, List<Movie> movieItems) { 
    this.activity = activity; 
    this.movieItems = movieItems; 
    bgColors = activity.getApplicationContext().getResources().getStringArray(R.array.movie_serial_bg); 
     this.originalMovieList = movieItems; 
     } 
+0

因此,他已经有一个很好的方法,并不知道它? – Nanoc

+0

我应该在** publishResults **方法上更改什么 –

+0

protected void publishResults(CharSequence约束,FilterResults结果)filteredData =(ArrayList )results.values; notifyDataSetChanged(); } –

1

这是我如何能够解决我的搜索代码的苦难。

MainActivity

public class MainActivity extends Activity { 

private List<Movie> currentMovieList = new ArrayList<Movie>(); 
private List<Movie> originalMovieList = new ArrayList<Movie>(); 
private CustomListAdapter adapter; 
private ListView mList; 
// Search EditText 
EditText inputSearch; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
    setContentView(R.layout.activity_main); 

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

adapter = new CustomListAdapter(this, currentMovieList); 
    mList.setAdapter(adapter); 


    inputSearch.addTextChangedListener(new TextWatcher() { 

     public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
      // When user changed the Text 

      String filterString = cs.toString().toLowerCase(); 
      Log.e("TAG", "filterString:" + filterString); 
      currentMovieList.clear(); 
      if (TextUtils.isEmpty(filterString)) { 
       currentMovieList.addAll(originalMovieList); 
      } 

      String filterableString; 
      for (Movie movie : originalMovieList) { 

      //search from the title field 
       if (movie.getTitle().toLowerCase().contains(filterString)) { 
        currentMovieList.add(movie); 
       } 
      //search from the year field 
       else if (String.valueOf(movie.getYear()).toLowerCase().contains(filterString)) 
       { 
        currentMovieList.add(movie); 
       } 
      //search from the rating field 
       else if (String.valueOf(movie.getRating()).toLowerCase().contains(filterString)) 
       { 
        currentMovieList.add(movie); 
       } 
      //search from the genre field 
       else if (movie.getGenre().toString().toLowerCase().contains(filterString)) 
       { 
        currentMovieList.add(movie); 
       } 
      } 
      adapter.notifyDataSetChanged(); 
      //FLAGS Cannot resolve method 'getFilter()' here 
     } 

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

}}

并添加到您的CustomListAdapter

public class CustomListAdapter extends BaseAdapter implements Filterable { 

    private Activity activity; 
private LayoutInflater inflater; 

private List<String>originalData = null; 
// private List<String>filteredData = null; 

private List<Movie> movieItems; 
private List<Movie> originalMovieList; 
private String[] bgColors; 
ImageLoader imageLoader = MyApplication.getInstance().getImageLoader(); 
private ItemFilter mFilter = new ItemFilter(); 


public CustomListAdapter(Activity activity, List<Movie> movieItems) { 
     this.activity = activity; 
     this.movieItems = movieItems; 
     // this.originalMovieList = movieItems; 
     this.originalMovieList = new ArrayList<Movie>(movieItems); 
     bgColors = activity.getApplicationContext().getResources().getStringArray(R.array.movie_serial_bg); 
     } 

    //Add Below Method 
    public void reloadData(){ 
     this.originalMovieList = new ArrayList<Movie>(movieItems); 
    notifyDataSetChanged(); 
     } 
    @Override 
public int getCount() { 
    return movieItems.size(); 
     } 

@Override 
    public Object getItem(int location) { 
     return movieItems.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.list_row_image, null); 

    if (imageLoader == null) 
     imageLoader = MyApplication.getInstance().getImageLoader(); 
    NetworkImageView thumbNail = (NetworkImageView) convertView.findViewById(R.id.thumbnail); 

    TextView serial = (TextView) convertView.findViewById(R.id.serial); 
    TextView title = (TextView) convertView.findViewById(R.id.title); 
    TextView rating = (TextView) convertView.findViewById(R.id.rating); 
    TextView genre = (TextView) convertView.findViewById(R.id.genre); 
    TextView year = (TextView) convertView.findViewById(R.id.releaseYear); 

    // getting movie data for the row 
    Movie m = movieItems.get(position); 

    // thumbnail image 
    thumbNail.setImageUrl(m.getThumbnailUrl(), imageLoader); 

    // title 
    title.setText(m.getTitle()); 

    // rating 
    rating.setText("Rating: " + String.valueOf(m.getRating())); 

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

     // release year 
    year.setText(String.valueOf(m.getYear())); 

    String color = bgColors[position % bgColors.length]; 
     serial.setBackgroundColor(Color.parseColor(color)); 




     return convertView; 
} 


      public Filter getFilter() { 
       return mFilter; 
      } 

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

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

        FilterResults results = new FilterResults(); 


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

        return results; 
       } 

       @SuppressWarnings("unchecked") 
       @Override 
       protected void publishResults(CharSequence constraint, FilterResults results) { 
        //filteredData = (ArrayList<String>) results.values; 
        //movieItems = (ArrayList<Movie>) results.values; 
        movieItems.clear(); 
        movieItems.addAll((ArrayList<Movie>) results.values); 
        notifyDataSetChanged(); 
       } 

      } 



} 

现在多数民众赞成在WRAP。感谢@DhavalPatel那个Guy是一位Android大师。 He made all this happen。 -Hoppy Coding

+0

@DhavalPatel再次感谢。 如果我的回答正确,您可以为此答案投票。 #眨眼 –