2013-01-16 13 views
13

ecco la mia attività principaleCome implementare getFilter() con adattatore personalizzato che si estende baseadapter

package com.javacodegeeks.android.lbs; 

import android.os.Bundle; 
import android.app.Activity; 
import android.content.Intent; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.widget.Toast; 
import lbs.promotion.*; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import org.apache.http.NameValuePair; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.AdapterView.OnItemClickListener; 

public class Curve extends Activity { 

    private ProgressDialog pDialog; 
    JSONParser jParser = new JSONParser(); 
    ArrayList<HashMap<String, String>> DaftarPromotion = new ArrayList<HashMap<String, String>>(); 

    private static String url_daftar_promotion = "http://10.0.2.2/webserver_maaug/promotion/daftar_promotion.php"; 

    String lon = "101.5178"; 
    String lat = "3.0724"; 

    public static final String TAG_SUCCESS = "success"; 
    public static final String TAG_DAFTAR_PROMOTION = "daftar_promotion"; 
    public static final String TAG_ID_PROMO = "PromoID"; 
    public static final String TAG_NAMA_PROMO = "PromoName"; 
    public static final String TAG_LINK_IMAGE_PROMO = "PromoImage"; 
    public static final String TAG_DESC_PROMO= "PromoDesc"; 
    public static final String TAG_CATE_PROMO = "PromoCate"; 
    public static final String TAG_CONT_PROMO = "PromoContact"; 
    public static final String TAG_DATES_PROMO = "PromoDateStart"; 
    public static final String TAG_DATEE_PROMO = "PromoDateEnd"; 

    JSONArray daftar_promotion = null; 

    ListView list; 

    PromotionListAdapter adapter; 

    EditText inputSearch; 

    private Curve activity; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_curve); 
    DaftarPromotion = new ArrayList<HashMap<String, String>>(); 

     new Activity().execute(); 
     activity = this; 
     list = (ListView) findViewById(R.id.list); 

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

     inputSearch.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
       // When user changed the Text 
       Curve.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 
      } 
     }); 




     list.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
     int position, long id) { 
      HashMap<String, String> map = DaftarPromotion.get(position); 
      String pna = map.get(TAG_NAMA_PROMO); 
      String pde = map.get(TAG_DESC_PROMO); 
      String pca = map.get(TAG_CATE_PROMO); 
      String pcon = map.get(TAG_CONT_PROMO); 
      String pds = map.get(TAG_DATES_PROMO); 
      String pdae = map.get(TAG_DATEE_PROMO); 



      Toast.makeText(Curve.this, pna +"\n" + pde +"\n" + pca +"\n" + pds +" to " + pdae +"\n" + pcon,Toast.LENGTH_LONG).show(); 

     } 
     }); 



     } 


    public boolean onCreateOptionsMenu(Menu menu) { 
      MenuInflater inflater = getMenuInflater(); 
      inflater.inflate(R.menu.smenu, menu); 
      return true; 
     } 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.about: 
       Toast.makeText(Curve.this,"Mobile Advertising Application Using GPS V1.0",Toast.LENGTH_LONG).show(); 
      return true; 
      case R.id.search:{ 
       Intent intent = new Intent(Curve.this, Search.class); 
       intent.putExtra("lon",lon); 
       intent.putExtra("lat",lat); 
       startActivity(intent); 
      //startActivity(new Intent(this, Search.class)); 

      } 
      return true; 
      default: 
      return super.onOptionsItemSelected(item); 
     } 
     } 

     public void SetListViewAdapter(ArrayList<HashMap<String, String>> daftar) { 
     adapter = new PromotionListAdapter(activity, daftar); 
     list.setAdapter(adapter); 
     } 

     @Override 
     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (resultCode == 100) { 
     Intent intent = getIntent(); 
     finish(); 
     startActivity(intent); 
     } 
     } 

     class Activity extends AsyncTask<String, String, String> { 

     @Override 
     protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(Curve.this); 
     pDialog.setMessage("Please Wait..."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(false); 
     pDialog.show(); 
     } 

     protected String doInBackground(String... args) { 
     List<NameValuePair> params = new ArrayList<NameValuePair>(); 
     JSONObject json = jParser.makeHttpRequest(url_daftar_promotion, "GET",params); 

     Log.d("All Products: ", json.toString()); 
     try { 
     int success = json.getInt(TAG_SUCCESS); 
     if (success == 1) { 
      daftar_promotion = json.getJSONArray(TAG_DAFTAR_PROMOTION); 
      for (int i = 0; i < daftar_promotion.length();i++){ 
      JSONObject c = daftar_promotion.getJSONObject(i); 
      String PromoID = c.getString(TAG_ID_PROMO); 
      String PromoName = c.getString(TAG_NAMA_PROMO); 
      String pat = "http://10.0.2.2/webserver_maaug/"; 
      String PromoImage = pat + c.getString(TAG_LINK_IMAGE_PROMO); 
      String PromoDesc = c.getString(TAG_DESC_PROMO); 
      String PromoCate = c.getString(TAG_CATE_PROMO); 
      String PromoDateStart = c.getString(TAG_DATES_PROMO); 
      String PromoDateEnd = c.getString(TAG_DATEE_PROMO); 
      String PromoContact = c.getString(TAG_CONT_PROMO); 

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

      map.put(TAG_ID_PROMO, PromoID); 
      map.put(TAG_NAMA_PROMO, PromoName); 
      map.put(TAG_LINK_IMAGE_PROMO, PromoImage); 
      map.put(TAG_DESC_PROMO, PromoDesc); 
      map.put(TAG_CATE_PROMO, PromoCate); 
      map.put(TAG_DATES_PROMO, PromoDateStart); 
      map.put(TAG_DATEE_PROMO, PromoDateEnd); 
      map.put(TAG_CONT_PROMO, PromoContact); 

      DaftarPromotion.add(map); 
      } 

      } else { 
      } 
      } catch (JSONException e) { 
      e.printStackTrace(); 
      } 
      return null; 
      } 

      protected void onPostExecute(String file_url) { 
      pDialog.dismiss(); 
      runOnUiThread(new Runnable() { 
      public void run() { 

      SetListViewAdapter(DaftarPromotion); 




       } 
      }); 
     } 
    } 
    } 

e questo è il mio adattatore personalizzato, è molto semplice, senza una classe di oggetti di essa la propria

package lbs.promotion; 

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

import com.javacodegeeks.android.lbs.Curve; 
import com.javacodegeeks.android.lbs.R; 

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

public class PromotionListAdapter extends BaseAdapter { 

private Activity activity; 
private ArrayList<HashMap<String, String>> data; 
private static LayoutInflater inflater = null; 
public ImageLoader imageLoader; 

public PromotionListAdapter(Activity a, ArrayList<HashMap<String, String>> d) { 

activity = a; 
data = d; 
inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
imageLoader = new ImageLoader(activity.getApplicationContext()); 
} 

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

public Object getItem(int position) { 
return position; 
} 

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

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

    View vi = convertView; 
     if (convertView == null)vi = inflater.inflate(R.layout.item_list_promotion, null); 

     TextView PromoID = (TextView) vi.findViewById(R.id.PromoID); 
     TextView PromoName = (TextView) vi.findViewById(R.id.PromoName); 
     TextView PromoImage = (TextView) vi.findViewById(R.id.PromoImage); 
     TextView PromoDesc = (TextView) vi.findViewById(R.id.PromoDesc); 
     TextView PromoCate = (TextView) vi.findViewById(R.id.PromoCate); 
     TextView PromoContact = (TextView) vi.findViewById(R.id.PromoContact); 
     TextView PromoDateStart = (TextView) vi.findViewById(R.id.PromoDateStart); 
     TextView PromoDateEnd = (TextView) vi.findViewById(R.id.PromoDateEnd); 
     ImageView thumb_image = (ImageView) vi.findViewById(R.id.image_promo); 

     HashMap<String, String> daftar_promotion = new HashMap<String, String>(); 
     daftar_promotion = data.get(position); 

     PromoID.setText(daftar_promotion.get(Curve.TAG_ID_PROMO)); 

     PromoName.setText(daftar_promotion.get(Curve.TAG_NAMA_PROMO)); 

     PromoImage.setText(daftar_promotion.get(Curve.TAG_LINK_IMAGE_PROMO)); 

     PromoDesc.setText(daftar_promotion.get(Curve.TAG_DESC_PROMO)); 

     PromoCate.setText(daftar_promotion.get(Curve.TAG_CATE_PROMO)); 

     PromoContact.setText(daftar_promotion.get(Curve.TAG_CONT_PROMO)); 

     PromoDateStart.setText(daftar_promotion.get(Curve.TAG_DATES_PROMO)); 

     PromoDateEnd.setText(daftar_promotion.get(Curve.TAG_DATEE_PROMO)); 

     imageLoader.DisplayImage(daftar_promotion.get(Curve.TAG_LINK_IMAGE_PROMO),thumb_image); 

     return vi; 

     } 




} 

qui è la mia layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical" > 

<!-- Editext for Search --> 
    <EditText android:id="@+id/search_box" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:hint="type to search" 
     android:inputType="text" 
     android:maxLines="1"/> 

<ListView 
android:id="@+id/list" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:divider="#040404" 
android:dividerHeight="1dp" 
android:listSelector="@drawable/list_selector" /> 

</LinearLayout> 

come faccio ad avere la funzione getFilter() lavoro? o c'è un modo più semplice per implementare il filtro nella mia listview? voglio filtrare in base al mio PromoName

risposta

52

Un filtro ha due componenti principali, il metodo performFiltering(CharSequence) e il metodo publishResults(CharSequence, FilterResults). In PromotionListAdapter, è necessario implementare l'interfaccia Filterable, quindi sovrascrivere il metodo getFilter() per restituire un nuovo filtro che ha implementato questi metodi.

Il metodo performFiltering(CharSequence) è il posto dove farai il grosso del tuo lavoro. L'argomento CharSequence è i dati su cui stai filtrando. Qui, prima dovrai determinare se l'elenco debba essere filtrato come caso base. Una volta deciso di eseguire il filtraggio, creare un nuovo ArrayList per il set di dati filtrato (nel tuo caso, una nuova ArrayList>) e scorrere il set completo di voci di elenco, aggiungendo i valori che corrispondono al filtro al nuovo ArrayList .

Il tipo di ritorno per il metodo performFiltering è FilterResults. FilterResults è un oggetto semplice con due variabili, int count e Object results. Una volta che performFiltering ha creato il nuovo ArrayList con i dati filtrati, creare un nuovo FilterResults, impostando il nuovo ArrayList come risultato e la dimensione di ArrayList come conteggio.

Il metodo publishResults(CharSequence, FilterResults) viene chiamato dopo i ritorni performFiltering(). Il parametro CharSequence è la stessa stringa su cui stavi filtrando. Il parametro FilterResults è il ritorno da performFiltering(). In questo metodo, ti consigliamo di impostare il tuo nuovo ArrayList come origine dati per il tuo Elenco e quindi chiamare notifyDataSetChanged() per aggiornare l'IU.

Al fine di implementare questo, ho avuto successo quando il mio adattatore tiene traccia sia della ArrayList originale dei dati e una ArrayList filtrata di ciò che viene attualmente mostrato. Ecco un codice standard basato sull'adattatore che può aiutarti a iniziare. Ho commentato sopra righe importanti.

public class PromotionListAdapter extends BaseAdapter implements Filterable 
{ 
    private Activity activity; 
    private static LayoutInflater inflater = null; 
    public ImageLoader imageLoader; 

    //Two data sources, the original data and filtered data 
    private ArrayList<HashMap<String, String>> originalData; 
    private ArrayList<HashMap<String, String>> filteredData; 

    public PromotionListAdapter(Activity a, ArrayList<HashMap<String, String>> d) 
    { 
     activity = a; 
     inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     imageLoader = new ImageLoader(activity.getApplicationContext()); 

     //To start, set both data sources to the incoming data 
     originalData = d; 
     filteredData = d; 
    } 

    //For this helper method, return based on filteredData 
    public int getCount() 
    { 
     return filteredData.size(); 
    } 

    //This should return a data object, not an int 
    public Object getItem(int position) 
    { 
     return filteredData.get(position); 
    } 

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

    //The only change here is that we'll use filteredData.get(position) 
    //Even better would be to use getItem(position), which uses the helper method (see the getItem() method above) 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 

     View vi = convertView; 
     if (convertView == null)vi = inflater.inflate(R.layout.item_list_promotion, null); 

     TextView PromoID = (TextView) vi.findViewById(R.id.PromoID); 
     TextView PromoName = (TextView) vi.findViewById(R.id.PromoName); 
     TextView PromoImage = (TextView) vi.findViewById(R.id.PromoImage); 
     TextView PromoDesc = (TextView) vi.findViewById(R.id.PromoDesc); 
     TextView PromoCate = (TextView) vi.findViewById(R.id.PromoCate); 
     TextView PromoContact = (TextView) vi.findViewById(R.id.PromoContact); 
     TextView PromoDateStart = (TextView) vi.findViewById(R.id.PromoDateStart); 
     TextView PromoDateEnd = (TextView) vi.findViewById(R.id.PromoDateEnd); 
     ImageView thumb_image = (ImageView) vi.findViewById(R.id.image_promo); 

     HashMap<String, String> daftar_promotion = new HashMap<String, String>(); 

     //Get data from filtered Data 
     //This line can be replaced with: 
     //  daftar_promotion = getItem(position); 
     daftar_promotion = filteredData.get(position); 

     PromoID.setText(daftar_promotion.get(Curve.TAG_ID_PROMO)); 

     PromoName.setText(daftar_promotion.get(Curve.TAG_NAMA_PROMO)); 

     PromoImage.setText(daftar_promotion.get(Curve.TAG_LINK_IMAGE_PROMO)); 

     PromoDesc.setText(daftar_promotion.get(Curve.TAG_DESC_PROMO)); 

     PromoCate.setText(daftar_promotion.get(Curve.TAG_CATE_PROMO)); 

     PromoContact.setText(daftar_promotion.get(Curve.TAG_CONT_PROMO)); 

     PromoDateStart.setText(daftar_promotion.get(Curve.TAG_DATES_PROMO)); 

     PromoDateEnd.setText(daftar_promotion.get(Curve.TAG_DATEE_PROMO)); 

     imageLoader.DisplayImage(daftar_promotion.get(Curve.TAG_LINK_IMAGE_PROMO),thumb_image); 

     return vi; 

    } 

    @Override 
    public Filter getFilter() 
    { 
     return new Filter() 
     { 
      @Override 
      protected FilterResults performFiltering(CharSequence charSequence) 
      { 
       FilterResults results = new FilterResults(); 

       //If there's nothing to filter on, return the original data for your list 
       if(charSequence == null || charSequence.length() == 0) 
       { 
        results.values = originalData; 
        results.count = originalData.size(); 
       } 
       else 
       { 
        ArrayList<HashMap<String,String>> filterResultsData = new ArrayList<HashMap<String,String>>(); 

        for(HashMap<String,String> data : originalData) 
        { 
         //In this loop, you'll filter through originalData and compare each item to charSequence. 
         //If you find a match, add it to your new ArrayList 
         //I'm not sure how you're going to do comparison, so you'll need to fill out this conditional 
         if(data matches your filter criteria) 
         { 
          filterResultsData.add(data); 
         } 
        }    

        results.values = filterResultsData; 
        results.count = filteredResultsData.size(); 
       } 

       return results; 
      } 

      @Override 
      protected void publishResults(CharSequence charSequence, FilterResults filterResults) 
      { 
       filteredData = (ArrayList<HashMap<String,String>>)filterResults.values; 
       notifyDataSetChanged(); 
      } 
     }; 
    } 
} 

E ce l'avete! Per quanto ne so, hai già implementato TextWatcher per l'inputText EditText impostato correttamente, quindi aggiungere il metodo getFilter() e apportare alcune altre modifiche minori all'Adattatore dovrebbe portare a una soluzione. Credo che tu possa anche creare una variabile membro sul tuo Adattatore per il tuo Filtro, quindi non stai creando una nuova istanza della classe ogni volta che viene chiamato getFilter(), ma lo copio/incollato da un precedente progetto mio e am sicuro che funzioni in questo modo. Gioca con esso e scopri cosa funziona per te! Spero che questo ti aiuti! E per favore commenta se hai bisogno di chiarimenti.

+0

ciao, grazie per il codice opaca, tra l'altro, mi piacerebbe che il filtro getfilter() lo filtrasse con qualsiasi parola chiave, ad esempio, se digito "eg", la promozione di egonutritions continuerà a essere visualizzata, proprio come il normale filtro, basato sui caratteri del PromoName, e come faccio a sovrascrivere il metodo getfilter()? implementando filtrabili giusto? –

+0

Hai perfettamente ragione, se il tuo adattatore implementa Filterable sarai in grado di sovrascrivere getFilter(). Per quanto riguarda il filtro, ci sono un paio di metodi nella classe String che possono aiutarti. 'contains' e' startsWith() 'può aiutare con il tuo condizionale, e potresti voler usare' toLowerCase() 'prima se il caso non ha importanza. La documentazione per tutti questi metodi è qui: http://developer.android.com/reference/java/lang/String.html – MattDavis

+0

ho trovato le risposte, grazie matt! : D –

Problemi correlati