0

我在這裏有兩個問題。在我的CustomListAdapter上實現Filterable接口後無法重新加載ListView內容

  • 的第一個問題去::我在CustomListAdapter啓用名錄數據搜索實現Filterable界面後,我意識到,每一次我嘗試重新加載列表視圖,它拒絕填充甚至認爲列表視圖我能夠從我的服務器獲取數據。 (我的ListView總是對重載設備方向的變化,我也加入了重新加載按鈕刷新列表視圖的onclick太)

  • 第二個問題去::我的搜索EditView中填充的ListView我很好平變化,但我意識到,當我清空EditView中,在ListView以前的數據不會恢復/先到恢復至先前的內容

下面是我的活動代碼

public class MainActivity extends Activity { 

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


    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); 
      reload_img = (ImageView) findViewById(R.id.reload_list); 


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

     //FETCH Movie-Data FROM SERVER TO LIST 
     fetchMovie(); 

     //Reload image click 
      reload_img.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View arg0) { 

        reload_list(); 
        } 
      }); 

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




    } 


    //RELOAD LISTVIEW METHOD 
      private void reload_list() 
      { 

       pDialog = new ProgressDialog(MainActivity.this); 
       // Showing progress dialog before making http request 
       pDialog.setMessage("Synchronising...."); 
       pDialog.show(); 
       pDialog.setCancelable(false); 
       pDialog.setCanceledOnTouchOutside(false); 


       flag_loading = true; 
       offSet = 0; 
       inputSearch.setText(""); 
       movieList.clear(); 

       fetchMovie(); 
       //adapter.notifyDataSetChanged(); 



      } 


    //LOAD DATA FROM SERVER TO LISTVIEW USING VOLLEY 
    private void fetchMovie() 
      { 

       // showing refresh animation before making http call 
       //swipeRefreshLayout.setRefreshing(true); 

       // appending offset to url 
       String url = Config.URL_TOP_250_URL + offSet; 
       //String url = Config.MOVIE_JSON_URL; 
       //String url = Config.MOVIE_JSON_URL_SHORT; 

       // Toast.makeText(MainActivity.this, 
       //  "::Json loaded:: ", Toast.LENGTH_SHORT).show(); 

       JsonArrayRequest movieReq = new JsonArrayRequest(url, 
         new Response.Listener<JSONArray>() { 
          @Override 
          public void onResponse(JSONArray response) { 
           // Log.d(TAG, response.toString()); 
           hidePDialog(); 

           if (response.length() > 0) { 

            //Toast.makeText(MainActivity.this, 
             //  "Json String : \n"+ response.toString(), Toast.LENGTH_LONG).show(); 

            // Parsing json 
            /**/ for (int i = 0; i < response.length(); i++) { 
             try { 

              JSONObject obj = response.getJSONObject(i); 

              int rank = obj.getInt("rank"); 

              Movie movie = new Movie(); 

              // movie.setRank(obj.getInt("rank")); 

              movie.setTitle(obj.getString("title")); 
              movie.setThumbnailUrl(obj.getString("image")); 
              movie.setRating(((Number) obj.get("rating")) 
                .doubleValue()); 

              movie.setYear(obj.getInt("releaseYear")); 

              // Genre is json array 
              JSONArray genreArry = obj.getJSONArray("genre"); 
              ArrayList<String> genre = new ArrayList<String>(); 
              for (int j = 0; j < genreArry.length(); j++) { 
               genre.add((String) genreArry.get(j)); 
              } 
              movie.setGenre(genre); 

              // adding movie to movies array 
              movieList.add(movie); 

              // updating offset value to highest value 
              if (rank >= offSet) 
               offSet = rank; 
              flag_loading = false; 
             } catch (JSONException e) { 
              e.printStackTrace(); 

              Toast.makeText(MainActivity.this, 
                "Network connection error \n "+ e.getMessage(), Toast.LENGTH_LONG).show(); 
             } 

            } 
            /**/ 

            // notifying list adapter about data changes 
            // so that it renders the list view with updated data 
            adapter.notifyDataSetChanged(); 

           } 
           else { 
            Toast.makeText(MainActivity.this, 
              "End of movie-list" , Toast.LENGTH_LONG).show(); 

           } 


          } 




         }, new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         VolleyLog.d(TAG, "Error :: " + error.getMessage()); 
         hidePDialog(); 


        } 

       }); 

       // Adding request to request queue 
       MyApplication.getInstance().addToRequestQueue(movieReq); 
      } 


} 

這裏是我的CustomListAdapter代碼

public class CustomListAdapter extends BaseAdapter { 

     private Activity activity; 
    private LayoutInflater inflater; 
    private List<Movie> movieItems; 
     private List<Movie> originalMovieList; 
     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; 
     this.originalMovieList = 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; 
        final List<Movie> list = movieItems; 

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

        String filterableString ; 

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

      } 


} 

正如你看到的,我真的把我的時間把這個整個代碼在一起,但在這個路口,我的頭旋轉,我無法弄清楚,爲什麼

  • 在方向改變,它使用之前突然重新填充的ListView數據停止填充後,我介紹了過濾的CustomListAdapter類,也

  • 當我清除搜索EditView中,在ListView內容不返回

  • 當我在Reload按鈕單擊,在列表中的內容不會重新加載,就像它當設備方向改變時。

我真的很感激提示幫助我,因爲我現在如此堅持。 Thanks in Advance

- 我做編輯CustomListAdapter變化是

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

      } 

也編輯了這一點。新增this.originalMovieList = new ArrayList<Movie>(movieItems);

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

添加了此方法CustomListAdapter

//Add Below Method 
public void reloadData(){ 
    this.originalMovieList = new ArrayList<Movie>(movieItems); 
    notifyDataSetChanged(); 
} 

在MainActivity類別也取代notifyDataSetChanged()與此

     `// notifying list adapter about data changes 
        // so that it renders the list view with updated data 
        //adapter.notifyDataSetChanged(); 
         adapter.reloadData();` 

-reload按鈕現在工作得很好,方向的改變重新加載頁面但是搜索不會填充ListView。 因此,搜索還沒有成型

+0

嘗試在適配器構造函數中更改** this.originalMovieList = movieItems; **以** this.originalMovieList = new ArrayList (movieItems); **。 –

+0

@ Dhaval-patel ::我將'this.originalMovieList = movieItems;'改爲this.originalMovieList = new ArrayList (movieItems);'並且我也修改了以下幾行'final List list = movieItems' was was現在更改爲'final列表 list = originalMovieList;'並且在'movieItems =(ArrayList )results.values;'更改爲'originalMovieList =(ArrayList )結果的方法** publicResults **代碼。值;' –

+0

哪些使重新加載工作,但搜索搜索自動停止工作 –

回答

0

以下是問題的答案:
1. ListView不重裝?看看你的代碼功能:

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

上述功能使你的適配器無法重新加載當然。爲什麼?因爲這一行:movieItems = (ArrayList<Movie>) results.values;。您將適配器中的movieItems引用到另一個List,因此您的MainActivity中的movieList.add(movie); d不會再對您的adapter中的任何內容進行更改。如何克服它?更改如下:

movieItems.clear(); 
movieItems.addAll((ArrayList<Movie>) results.values); 
notifyDataSetChanged(); 

但是,您的Search功能仍然無法正常工作。爲什麼?因爲在performFiltering中,您試圖在movieItems中搜索不是您的備份數據。 - >您應該在您的備份數據中搜索:originalMovieList,然後通過在movieItems中添加發布。

//change final List<Movie> list = movieItems; 
//to belowed line in peformFiltering 
final List<String> list = originalData; 
  • 爲什麼你的電源適配器沒有恢復?因爲你控制它,但你不會恢復它。你應該恢復它在你的peformFiltering功能:

    protected FilterResults performFiltering(CharSequence constraint) { 
         String filterString = constraint.toString().toLowerCase(); 
         if(TextUtils.isEmpty(filterString)){ 
          // do restore backup data here 
         }else{ 
          // do filter here. 
         } 
    } 
    
  • +0

    非常樂意爲您提供幫助和時間。將適用於我的代碼並更新您。雖然我已經調整了我的publicResult方法,使其具有'movieItems.clear(); movieItems.addAll((ArrayList )results.values); notifyDataSetChanged();'已經在現在。在這個問題上也更新了。 –

    +0

    我不知道你的意思是什麼'/ /在這裏恢復備份數據'也是你的意思是''在你的'if語句'中做'過濾這裏',因爲我所有的嘗試都是在程序中標記。 - 也許你應該填充**在這裏恢復備份數據** if條件的方面,以便我可以知道你在暗示什麼 –

    +0

    我想相信你在這裏做錯了我應該使用'final列表 list = originalData;'原始數據沒有被聲明/實例化,程序中都有。 - 你的意思是最終名單 list = originalMovieList;'? –

    0

    這是我如何能夠解決我的搜索代碼的苦難。

    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) { 
           if (movie.getTitle().toLowerCase().contains(filterString)) { 
            currentMovieList.add(movie); 
           } 
           else if (String.valueOf(movie.getYear()).toLowerCase().contains(filterString)) 
           { 
            currentMovieList.add(movie); 
           } 
           else if (String.valueOf(movie.getRating()).toLowerCase().contains(filterString)) 
           { 
            currentMovieList.add(movie); 
           } 
           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那個傢伙是一位Android大師。 He made all this happen. -Happy Coding