2014-11-06 110 views
0

你好,我做了一个动态列表视图。现在我想在listview.if中添加过滤器,如果我在edittext中输入文本,那么计算搜索的项目应该显示.. hasve called addTextChangedListener to my edittext..and叫我adapter..but很老我应该怎么在我的滤波方法写成它是一个动态的ListView任何想法的方法过滤器...过滤器动态列表视图android

这里是我的代码:

package com.XXXXX.XXXXX; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Locale; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.app.Dialog; 
import android.content.Context; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.Handler; 
import android.support.v4.widget.SwipeRefreshLayout; 
import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.Window; 
import android.widget.AdapterView; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.ProgressBar; 
import android.widget.AdapterView.OnItemClickListener; 

import com.XXXXX.adapter.UpdateSingleItemViewActivity; 
import com.XXXXX.adapter.UpdatesAdapterList; 
import com.XXXXX.local.database.DBController; 
import com.XXXXX.XXXXX.XXXXX.constant.Constant; 
import com.XXXXX.XXXXX.XXXXX.utils.Utility; 

public class Cardiology_updates extends Activity implements OnClickListener, 
     OnRefreshListener { 
    EditText et ; 
    private Context appContext; 
    // ProgressDialog mProgressDialog; 
    private Dialog dialog; 
    private boolean isFinish = false; 
    String result = ""; 
    JSONObject jsonobject; 
    JSONArray jsonArray; 
    ArrayList<HashMap<String, String>> UpdatesHmList; 
    public static ArrayList<HashMap<String, String>> FinalLocalDataList; 
    ArrayList<HashMap<String, String>> LocalDataList; 
    DBController controller = new DBController(this); 
    HashMap<String, String> queryValues; 
    ListView list; 
    UpdatesAdapterList adapter; 
    public static String UpdateID = "UpdateID"; 
    public static String UpdateTitle = "Title"; 
    /* 
    * public static String UpdateDescription = "Description"; public static 
    * String POPULATION = "UpdateDate"; public static String UpdateImage = 
    * "Photo"; 
    */ 

    public static String UpdateDescription = "Description"; 
    public static String POPULATION = "Title"; 
    public static String UpdateImage = "Complete_imagePath"; 

    public static String Complete_imagePath; 
    public static String Title; 
    public static String Description; 

    SwipeRefreshLayout swipeLayout; 
    private ProgressBar progressbar; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_cardiology_updates); 
//  controller.deleteAllJsonData(); 
     appContext = this; 
     animationView(); 
     initComponent(); 

    } 

    private void animationView() { 
     // TODO Auto-generated method stub 
     progressbar = (ProgressBar) findViewById(R.id.loading); 
    } 

    private void initComponent() { 
     // TODO Auto-generated method stub 
     swipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container); 
     swipeLayout.setOnRefreshListener(this); 
     swipeLayout.setColorScheme(android.R.color.holo_blue_bright, 
       android.R.color.holo_green_light, 
       android.R.color.holo_orange_light, 
       android.R.color.holo_red_light); 


     dialog = new Dialog(appContext); 
     dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     dialog.setContentView(R.layout.alert_dialog); 
     ((Button) findViewById(R.id.Button01)).setOnClickListener(this); 
     ((Button) dialog.findViewById(R.id.btnOk)).setOnClickListener(this); 

     new GetUpdatesInfo().execute(); 

    } 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 

     if (v.getId() == R.id.Button01) { 

      finish(); 
      // finishActivity() ; 
     } else if (v.getId() == R.id.btnOk) { 
      dialog.dismiss(); 
      if (isFinish) { 
       this.finish(); 
      } 

     } 
    } 

    public class GetUpdatesInfo extends AsyncTask<String, Void, String> { 

     protected void onPreExecute() { 
      super.onPreExecute(); 
      if (progressbar.getVisibility() != View.VISIBLE) { 
       progressbar.setVisibility(View.VISIBLE); 
      } 
     } 

     @Override 
     protected String doInBackground(String... params) { 
      // Create an array 
      UpdatesHmList = new ArrayList<HashMap<String, String>>(); 
      // Retrieve JSON Objects from the given URL address 
      String url = null; 

      url = Constant.serverUrl + "/GetUpdateList"; 
      result = Utility.postParamsAndfindJSON(url); 
      Log.e("result doInBackground", "" + result); 
      if (!(result == null)) { 
       try { 
        controller.deleteAllJsonData(); 
        // Locate the array name in JSON 
        jsonArray = new JSONArray(result); 

        for (int i = 0; i < jsonArray.length(); i++) { 
         HashMap<String, String> map = new HashMap<String, String>(); 

         jsonobject = jsonArray.getJSONObject(i); 
         // Retrive JSON Objects 
         map.put("UpdateID", jsonobject.getString("UpdateID")); 
         map.put("Title", jsonobject.getString("Title")); 

         String Upadates_Photo = jsonobject.optString("Photo") 
           .toString(); 

         String Complete_imagePath = Constant.prifixserverUrl 
           + Upadates_Photo; 
         String Title = jsonobject.getString("Title").toString(); 
         String Description = jsonobject 
           .getString("Description").toString(); 

         String noHtml = Description.replaceAll("<[^>]*>", ""); 

         String parseResponse = noHtml.replaceAll("&nbsp;", ""); 

         map.put("Photo", Complete_imagePath); 
         map.put("Description", Description); 
         map.put("UpdateDate", 
           jsonobject.getString("UpdateDate")); 

         Log.e("UpdateID ", 
           " " 
             + jsonobject.getString("UpdateID") 
               .toString()); 
         Log.e("Title ", " " 
           + jsonobject.getString("Title").toString()); 
         Log.e("Complete_imagePath ", 
           " " + Complete_imagePath.toString()); 

         Log.e("Description ", " " + parseResponse); 

         Log.e("UpdateDate ", 
           " " 
             + jsonobject.getString("UpdateDate") 
               .toString()); 

         queryValues = new HashMap<String, String>(); 
         queryValues.put("Complete_imagePath", 
           Complete_imagePath); 
         queryValues.put("Title", Title); 
         queryValues.put("Description", Description); 
         controller.insertAllJsonData(queryValues); 
         // Set the JSON Objects into the array 
         UpdatesHmList.add(map); 
        } 

       } catch (JSONException e) { 
        Log.e("Error", e.getMessage()); 
        e.printStackTrace(); 
       } 
      } 
      return result; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      // Locate the listview in listview_main.xml 
      if (progressbar.getVisibility() == View.VISIBLE) { 
       progressbar.setVisibility(View.GONE); 
      } 
      /* 
      * if (result == null) { //mProgressDialog.dismiss(); 
      * localalldata(); 
      * 
      * } 
      */ 
      localalldata(); 

      /* 
      * list = (ListView) findViewById(R.id.list_Upadates); // Pass the 
      * results into ListViewAdapter.java adapter = new 
      * UpdatesAdapterList(Cardiology_updates.this, FinalLocalDataList); 
      * // Set the adapter to the ListView list.setAdapter(adapter); 
      */ 

      // Close the progressdialog 
      // mProgressDialog.dismiss(); 
     } 

    } 

    @Override 
    public void onRefresh() { 
     // TODO Auto-generated method stub 

     // TODO Auto-generated method stub 

     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
      getSomeData(); 
//    localalldata(); 
       swipeLayout.setRefreshing(false); 
      } 
     }, 5000); 

    } 

    protected void getSomeData() { 
     // TODO Auto-generated method stub 
     // localalldata(); 
     new GetUpdatesInfo().execute(); 
     adapter.notifyDataSetChanged(); 
     /* 
     * if (LocalDataList == null) { Log.e("LocalDataList inside if ", 
     * "LocalDataList inside if "); new GetUpdatesInfo().execute(); 
     * 
     * } else { // adapter.imageLoader.clearCache(); 
     * Log.e("LocalDataList else ", "LocalDataList else "); 
     * 
     * adapter.notifyDataSetChanged(); } 
     */ 

    } 

    private void localalldata() { 
     // TODO Auto-generated method stub 
     LocalDataList = controller.getAllJsonData(); 
     FinalLocalDataList = new ArrayList<HashMap<String, String>>(); 

     for (HashMap<String, String> hashMap : LocalDataList) { 
      System.out.println(hashMap.keySet()); 
      HashMap<String, String> map = new HashMap<String, String>(); 
      for (String key : hashMap.keySet()) { 
       System.out.println(hashMap.get(key)); 

       Complete_imagePath = hashMap.get("Complete_imagePath"); 
       Title = hashMap.get("Title"); 
       Description = hashMap.get("Description"); 

       map.put("Complete_imagePath", Complete_imagePath); 
       map.put("Title", Title); 
       map.put("Description", Description); 
       Log.v("All Json CodiateUpdate Title", "" + Complete_imagePath); 
       Log.v("All Json CodiateUpdate Title", "" + Title); 
      } 
      FinalLocalDataList.add(map); 
     } 
     list = (ListView) findViewById(R.id.list_Upadates); 
     // Pass the results into ListViewAdapter.java 
     adapter = new UpdatesAdapterList(Cardiology_updates.this, 
       FinalLocalDataList); 
     // Set the adapter to the ListView 
     list.setAdapter(adapter); 
     // adapter.notifyDataSetChanged(); 

     et = (EditText) findViewById(R.id.search); 

     // Capture Text in EditText 
     et.addTextChangedListener(new TextWatcher() { 

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


      } 

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

      @Override 
      public void onTextChanged(CharSequence arg0, int arg1, int arg2, 
        int arg3) { 
       //String text = et.getText().toString().toLowerCase(Locale.getDefault()); 
       adapter.getFilter().filter(arg0); 
      } 
     }); 

     } 



     } 

这里我的适配器类包括过滤器:

package com.XXXXX.adapter; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Locale; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.Filter; 
import android.widget.Filterable; 
import android.widget.ImageView; 
import android.widget.TextView; 

import com.XXXXX.XXXXX.Cardiology_updates; 
import com.XXXXX.XXXXX.R; 
import com.XXXXX.imageloader.ImageLoader; 

public class UpdatesAdapterList extends BaseAdapter implements Filterable { 

    // Declare Variables 
    Context context; 
    LayoutInflater inflater; 
    ArrayList<HashMap<String, String>> data; 
    public ImageLoader imageLoader; 
     private Activity activity; 
    HashMap<String, String> resultp = new HashMap<String, String>(); 

    public UpdatesAdapterList(Context context, 
      ArrayList<HashMap<String, String>> arraylist) { 
     this.context = context; 
     data = arraylist; 
     imageLoader = new ImageLoader(context.getApplicationContext()); 
    } 

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

    @Override 
    public Object getItem(int position) { 
     return null; 
    } 

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

    public View getView(final int position, View convertView, ViewGroup parent) { 
     // Declare Variables 
     TextView UpdateTitle; 
     TextView country; 
     TextView population; 
     ImageView UpdateImage; 

     inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     View itemView = inflater.inflate(R.layout.listview_updateitem, parent, false); 
     // Get the position 
     resultp = data.get(position); 

     // Locate the TextViews in listview_item.xml 
     UpdateTitle = (TextView) itemView.findViewById(R.id.txtUpdatetitle); 
     //country = (TextView) itemView.findViewById(R.id.country); 
    // population = (TextView) itemView.findViewById(R.id.population); 

     // Locate the ImageView in listview_item.xml 
     UpdateImage = (ImageView) itemView.findViewById(R.id.list_UpdateImage); 

     // Capture position and set results to the TextViews 
     UpdateTitle.setText(resultp.get(Cardiology_updates.UpdateTitle)); 
    // country.setText(resultp.get(UpdatesActivity.COUNTRY)); 
    // population.setText()); 
     // Capture position and set results to the ImageView 
     // Passes flag images URL into ImageLoader.class 

     imageLoader.DisplayImage(resultp.get(Cardiology_updates.UpdateImage), UpdateImage); 
     // Capture ListView item click 
     itemView.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // Get the position 
       resultp = data.get(position); 
       Intent intent = new Intent(context, UpdateSingleItemViewActivity.class); 
       // Pass all data rank 
       intent.putExtra("UpdateTile", resultp.get(Cardiology_updates.UpdateTitle)); 
       // Pass all data country 
       intent.putExtra("UpdateDescription", resultp.get(Cardiology_updates.UpdateDescription)); 
       // Pass all data population 
       intent.putExtra("population",resultp.get(Cardiology_updates.POPULATION)); 
       // Pass all data flag 
       intent.putExtra("UpdateImage", resultp.get(Cardiology_updates.UpdateImage)); 
       // Start SingleItemView Class 
       intent.putExtra("position", position); 
       context.startActivity(intent); 

      } 
     }); 
     return itemView; 
    } 

    public Filter getFilter() { 

     Filter filter = new Filter() { 

       FilterResults results; 
       ArrayList<HashMap<String, String>> filteredList; 

       @Override 
       protected void publishResults(CharSequence constraint, 
        FilterResults results) { 
        // Has the filtered values 
        data = (ArrayList<HashMap<String, String>>) results.values; 
        notifyDataSetChanged();   
       } 

       @Override 
       protected FilterResults performFiltering(CharSequence constraint) { 
        // Holds the results of a filtering operation in values 
        results = new FilterResults(); 
        filteredList= new ArrayList<HashMap<String, String>>(); 

        //This is the search string user typed in EditText. 
        String searchString = constraint.toString().toUpperCase(Locale.getDefault()); 

        /* 
        * Code to update the filteredList based on Search String. 
        * 
        * I'm just writing pseudo code for search, based on 
        * Cardiology_updates.UpdateTitle 
        */ 
        int mCount=data.size(); 
        for (int i = 0; i < mCount; i++) { 
         HashMap<String, String> obj= data.get(i); 
         String updateTitle=obj.get(Cardiology_updates.UpdateTitle); 
         if(updateTitle.contains(searchString)){ 
          filteredList.add(obj); 
         } 
        } 

        synchronized (this) { 
         // set the Filtered result to return 
         results.count = filteredList.size(); 
         results.values = filteredList; 
        } 

       return results; 
      } 

     }; 
     return filter; 
} 
} 

回答

0

您需要在UpdatesAdapterList类中实现Filterable接口。

有关详细说明,请访问How to implement getfilter() with custom adapter that extends baseadapter?

public class UpdatesAdapterList extends BaseAdapter implements Filterable { 
... 

@Override 
public Filter getFilter(){ 
     // Your Search logic goes here.. 
    Filter filter = new Filter() { 
      FilterResults results; 
      ArrayList<HashMap<String, String>> filteredList; 

      @Override 
      protected void publishResults(CharSequence constraint, 
       FilterResults results) { 
       // Has the filtered values 
       data = (ArrayList<HashMap<String, String>>) results.values; 
       notifyDataSetChanged();   
      } 

      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       // Holds the results of a filtering operation in values 
       results = new FilterResults(); 
       filteredList= new ArrayList<HashMap<String, String>>(); 

       //This is the search string user typed in EditText. 
       String searchString = constraint.toString(); 

       /* 
       * Code to update the filteredList based on Search String. 
       * 
       * I'm just writing pseudo code for search, based on 
       * Cardiology_updates.UpdateTitle 
       */ 
       int mCount=data.size(); 
       for (int i = 0; i < mCount; i++) { 
        HashMap<String, String> obj= data.get(i); 
        String updateTitle=obj.get(Cardiology_updates.UpdateTitle); 
        if(updateTitle.contains(searchString)){ 
         filteredList.add(obj); 
        } 
       } 

       synchronized (this) { 
        // set the Filtered result to return 
        results.count = filteredList.size(); 
        results.values = filteredList; 
       } 
      } 
      return results; 
     } 

    }; 
    return filter; 
} 

} 
+0

很老任何想法在逻辑部分被软件写.. :( – vvv12 2014-11-06 09:17:28

+0

我已经为搜索逻辑更新的伪代码。 – blizzard 2014-11-06 10:38:41

+0

我的列表视图是越来越过滤完美,但同时backpressing按钮清除列表视图的EditText不获取更新 – vvv12 2014-11-10 13:58:50