Android Studio Filter, ListView With Perzonalized adapter

1

I have the next class

public class ContactsListDialog extends Dialog implements DialogInterface.OnClickListener  {

    private ListView list;
    private EditText filterText = null;
    AdapterMostrarContactos  adapter = null;
    private static final String TAG = "CityList";
    String[] aux ;
    Activity activity;

    ArrayList<String> contactosnNombre;
    ArrayList<String> contactosTele;
    ArrayList<String> contactosImg;
    ArrayList<Contacto> contactos = new ArrayList<Contacto>() ;

    public ContactsListDialog(Context context, String[] contactos, Activity activity,ArrayList<String> contactosnNombre,ArrayList<String> contactosTele,ArrayList<String> contactosImg) {
        super(context);
        aux = contactos;
        this.activity = activity;
        this.contactosImg = contactosImg;
        this.contactosnNombre = contactosnNombre;
        this.contactosTele = contactosTele;
        setContentView(R.layout.activity_dialogperzonalizate);
        this.setTitle("Seleccionar Contacto");
        filterText = (EditText) findViewById(R.id.EditBox);
        filterText.addTextChangedListener(filterTextWatcher);
        list = (ListView) findViewById(R.id.List);
      //  adapter = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, contactos);


        int cantidad = contactosnNombre.size();
        int iterador = 0 ;

        while(iterador<cantidad){
        Contacto aux = new Contacto(contactosnNombre.get(iterador),contactosTele.get(iterador), Uri.parse(contactosImg.get(iterador)));

        this.contactos.add(aux);
            iterador++;
        }

     adapter = new AdapterMostrarContactos(activity,this.contactos);




        list.setAdapter(adapter);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> a, View v, int position, long id) {

            }
        });
    }
    @Override
    public void onClick(DialogInterface dialogInterface, int i) {

    }

    private TextWatcher filterTextWatcher = new TextWatcher() {

        public void afterTextChanged(Editable s) {
        }

        public void beforeTextChanged(CharSequence s, int start, int count,
                                      int after) {
        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
          adapter.getFilter(adapter).filter(filterText.getText().toString());
        }

    };



}

which has an EDITBOX and a LISTVIEW as layout, this is the layout

<EditText android:id="@+id/EditBox"
    android:maxLines="1"
    android:layout_height="wrap_content"
    android:layout_width="270dp"
    android:layout_marginRight="70dp"
    android:layout_marginLeft="30dp">
</EditText>
<ListView android:id="@+id/List"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:choiceMode="singleChoice"

    >
</ListView>

The listView has the following perzonalized adapter,

this is the class

class AdapterMostrarContactos extends BaseAdapter {

protected Activity activity ;

ArrayList<Contacto> contactos;



public AdapterMostrarContactos(Activity activity,  ArrayList<Contacto> contactos){
this.activity = activity;
    this.contactos = contactos;
}

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

@Override
public Object getItem(int position) {
    return contactos.get(position);
}

@Override
public long getItemId(int position) {
    return contactos.get(position).getId();
}

@Override
public View getView(int position, View contentView, ViewGroup parent) {
    View vi=contentView;


        LayoutInflater inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        vi = inflater.inflate(R.layout.activity_listado_confoto_, null);

    TextView nombre = (TextView) vi.findViewById(R.id.texto_principal);
    TextView telefono = (TextView) vi.findViewById(R.id.texto_secundario);
    ImageView Img = (ImageView) vi.findViewById(R.id.icon);

    Contacto item = contactos.get(position);

    nombre.setText(item.getNombre());

    telefono.setText(item.getTelefono());

    Img.setImageURI(item.getImagen());


    return vi;
}

public Filter getFilter(final AdapterMostrarContactos adapter ) {


    Filter filter = new Filter() {

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {

            List<String> arrayListNames = (List<String>) results.values;
            adapter.notifyDataSetChanged();
        }
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            FilterResults results = new FilterResults();
            ArrayList<String> FilteredArrayNames = new ArrayList<String>();

            // perform your search here using the searchConstraint String.

            constraint = constraint.toString().toLowerCase();
            for (int i = 0; i < contactos.size(); i++) {
                String dataNames = contactos.get(i).getNombre();
                if (dataNames.toLowerCase().startsWith(constraint.toString())) {
                    FilteredArrayNames.add(dataNames);
                }
            }

            results.count = FilteredArrayNames.size();
            results.values = FilteredArrayNames;
            //Log.e("VALUES", results.values.toString());

            return results;
        }
    };

    return filter;

}

this is the adapter layout

<?xml version="1.0" encoding="utf-8"?>

<ImageView
    android:id="@+id/icon"
    android:layout_width="60dp"
    android:layout_height="60dp"
    android:padding="5dp"
    />

<LinearLayout android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/texto_principal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="5dp"
        android:padding="2dp"
        android:textColor="#489e37" />
    <TextView
        android:id="@+id/texto_secundario"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:layout_marginLeft="10dp"/>
</LinearLayout>

the issue is that the listview is not filtering me, currently it looks like this and I would like to be able to filter it,

    
asked by Bruno Sosa Fast Tag 24.10.2017 в 21:57
source

1 answer

2

Inside the adapter creates a method that filters the data according to the text entered by the user. Then simply call that method from your Dialog and pass the text that the user enters.

Your adapter should look like this:

class AdapterMostrarContactos extends BaseAdapter {

    protected Activity activity ;
    ArrayList<Contacto> contactos;
    ArrayList<Contacto> copyContactos = new ArrayList<>();

    public AdapterMostrarContactos(Activity activity,  ArrayList<Contacto> contactos){
        this.activity = activity;
        this.contactos = contactos;
        this.copyContactos.addAll(contactos); // Crea una copia de los contactos
    }

    ...

    /* Filtra los datos del adaptador */
    public void filtrar(String texto) {

        // Elimina todos los datos del ArrayList que se cargan en los
        // elementos del adaptador
        contactos.clear();

        // Si no hay texto: agrega de nuevo los datos del ArrayList copiado
        // al ArrayList que se carga en los elementos del adaptador
        if (texto.length() == 0) {
            contactos.addAll(copyContactos);
        } else {

            // Recorre todos los elementos que contiene el ArrayList copiado
            // y dependiendo de si estos contienen el texto ingresado por el
            // usuario los agrega de nuevo al ArrayList que se carga en los 
            // elementos del adaptador.
            for (Contacto contacto : copyContactos) {

                if (contacto.getNombre().contains(texto)) {
                    contactos.add(contacto);
                }
            }
        }

        // Actualiza el adaptador para aplicar los cambios
        notifyDataSetChanged();
    }

}

In your class ContactsListDialog you call the filtrar method.

public class ContactsListDialog extends Dialog implements DialogInterface.OnClickListener  {

    ...

    private TextWatcher filterTextWatcher = new TextWatcher() {

        ...

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
          adapter.filtrar(filterText.getText().toString());
        }

    };
}

Reference
link

    
answered by 25.10.2017 / 14:36
source