简体   繁体   中英

How to implement SearchView with ListView using custom object arraylist?

I have a custom listview, which contains an object type Arraylist, and on this same activity I have a SearchView, how to search and display only the objects according to the keywords eg getName (), getCity () , ... Here my code, my onResume

    @Override
    protected void onResume() {
        super.onResume();
ArrayList<User> users;
    searchBar = findViewById(R.id.maBtnSearch);

        db = new DatabaseUser(this); 
        users = db.getData(); 

        final CustomAdapter adapter = new CustomAdapter(this, users); 
        listView.setAdapter(adapter);

        searchBar.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                adapter.getFilter().filter(newText);
                return false;
            }
        });

    }

This is my adapter class:

    package com.example.mickael.gestioclientel;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

/**
 * Created by MICKAEL on 02/12/2017.
 */

class CustomAdapter extends ArrayAdapter{

    private Context context;
    private LayoutInflater inflater;
    private ArrayList<User> users; //Lui transmettre le tableau adapter
    private DatabaseUser db;

    public CustomAdapter(Context context, ArrayList<User> users){
        super(context, R.layout.design_list_user, users); //Lui transmettre le layout design de ta listeview
        db = new DatabaseUser(context);
        this.context = context;
        inflater = LayoutInflater.from(context);
        this.users = users;
    }


    private class ViewHolder{
        TextView name, phone, date;
        ImageView btnDial, btnMap, menuPoint;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        final ViewHolder viewHolder;

        if(convertView == null){
            //Reglage general
            viewHolder = new ViewHolder();
            convertView = inflater.inflate(R.layout.design_list_user, parent, false); //Layout du design

            //Recuperation des ID
            viewHolder.name = convertView.findViewById(R.id.luPrenom);
            viewHolder.phone = convertView.findViewById(R.id.maTxtNumber);
            viewHolder.btnDial = convertView.findViewById(R.id.maBtnDial);
            viewHolder.btnMap = convertView.findViewById(R.id.maBtnMap);
            viewHolder.menuPoint = convertView.findViewById(R.id.luTrois);
            viewHolder.date = convertView.findViewById(R.id.maAdd);

            //Definition du tag
            convertView.setTag(viewHolder);

        }else{
            viewHolder = (ViewHolder) convertView.getTag();
        }

        //Definition des changements
        final User user = users.get(position);

        //On regle la taille du nom selon les caractere
        if(user.getName().length() == 15){
            viewHolder.name.setTextSize(24);
        }else if(user.getName().length() == 16){
            viewHolder.name.setTextSize(23);
        }else if(user.getName().length() == 17){
            viewHolder.name.setTextSize(22);
        }else if(user.getName().length() > 18){
            viewHolder.name.setTextSize(21);
        }
        viewHolder.name.setText(user.getName()); //Definition du nom


        //Definition de lajout ou modification
        String addOrUpdate = "Modifie le";
        viewHolder.date.setText(addOrUpdate + " " + user.getDate()); //Definition de la date
        viewHolder.date.setTextSize(15);



        //TODO Je dois regler ce probleme de zero ci dessous
        String phone = String.valueOf(user.getPhone());
        if(phone.equals("93260")){
            phone = "No number phone";
            viewHolder.phone.setTextSize(16);
        }else{
            phone = "0" + phone;
            viewHolder.phone.setTextSize(20);
        }
        viewHolder.phone.setText(phone);


        //OnClick sur les boutons
        viewHolder.btnDial.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
                        //TODO ICI Aussi Je dois regler ce probleme de zero ci dessous
                        Uri.parse("tel:0" + user.getPhone()));
                context.startActivity(intent); //Laligne la plus importante!!
            }
        });

        viewHolder.btnMap.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                adressMap(); //Fonction appel de louverture des map
            }
            public void adressMap() {
                String adress = user.getAdresse();
                String txtFind = " ";
                String txtReplace= "+";
                String tmp;

                int lgFind = txtFind.length();

                for (int k = 0; k < adress.length(); k++) {
                    try {
                        tmp = adress.substring(k, k + lgFind);
                    }
                    catch(Exception e) {
                        break;
                    }
                    if ( tmp.equalsIgnoreCase(txtFind) ) {
                        adress = adress.substring(0, k) + txtReplace + adress.substring(k + lgFind,adress.length());
                    }
                }

                Intent intent = new Intent(Intent.ACTION_VIEW,
                        Uri.parse("google.navigation:q=" +adress+ "+" + user.getCity()));
                context.startActivity(intent);
            } //Remplacement des espace par des "+"
        }); //Pour lancer la navigation



        //le menu a 3 points
        viewHolder.menuPoint.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                menuTroisPoint(viewHolder, user);
            }
        });


        return convertView;
    }

    public void menuTroisPoint(ViewHolder viewHolder, final User user) {
        PopupMenu popupMenu = new PopupMenu(context, viewHolder.menuPoint);

        popupMenu.getMenuInflater().inflate(R.menu.popup_menu, popupMenu.getMenu());

        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Intent intent;
                switch (item.getItemId()){
                    case R.id.menu_delete:
                        //Si il selectionne Delete on lui apparait un popup de securite
                        dialogConfirmDelete(user);
                        break;
                    case R.id.menu_edit:
                        intentPageEdit(user); //Vers la page dedition
                        break;
                    case R.id.menu_send:
                        popupSendSMS();
                        break;
                }
                return true;
            }
        });
        popupMenu.show();
    }

    public void popupSendSMS() {
        android.support.v7.app.AlertDialog.Builder cBuilder = new android.support.v7.app.AlertDialog.Builder(context);
        View mView = LayoutInflater.from(context).inflate(R.layout.custom_dialog_sms, null);

        RadioGroup rg = mView.findViewById(R.id.cdsRadioGroup);
        EditText inputPers = mView.findViewById(R.id.cdsInputPers);

        int radioId = rg.getCheckedRadioButtonId();

        if (radioId == R.id.cdsRadioPers) { //Cest le ID du RADIO LUI MEME
            inputPers.setEnabled(true); //TODO CORRIGER CE PROBLEME
        }

        cBuilder.setView(mView);
        android.support.v7.app.AlertDialog dialog = cBuilder.create();
        dialog.show();
    }

    public void dialogConfirmDelete(final User user) {
        AlertDialog.Builder popupSure = new AlertDialog.Builder(context); //On creer la fenetre
        popupSure.setTitle("Delete"); //Le titre de l'alerte
        popupSure.setMessage("Are you sure?");

        popupSure.setNegativeButton("CANCEL", null);  //Option cancel
        //Option OK
        popupSure.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //On supprime lutilisateur selon le ID
                delete(user);
            }
        });  //Option ok
        popupSure.show(); //On fait apparaitre le popup
    }

    public void delete(User user) {
        db.delete((int)user.getId());
        Toast.makeText(context, "" + user.getName() + " deleted", Toast.LENGTH_SHORT).show();
        Intent intent = new Intent(context, MainActivity.class);
        context.startActivity(intent);
        ((Activity)context).finish();
    } //Supprimer un user

    public void intentPageEdit(User user) {
        Intent intent;
        intent = new Intent(context, AddUserActivity.class);
        Bundle args = new Bundle(); //On creer le bundle car cest un objet
        args.putSerializable("user", (user)); //On pose les donnees de l'intent pour le convertir en bundle en tant que objet
        intent.putExtra("BUNDLE", args); //On place les donnes enregistrer dans l'intent quon fera passe
        context.startActivity(intent);
    } //Aller vers la page dedition


}

up Thanks help me please Thanks help me please Thanks help me please Thanks help me please

Make one more arraylist in your adapter class and make your adapter implements Filterable , try changing your adapter like below :

class CustomAdapter extends ArrayAdapter implements Filterable{

private Context context;
private LayoutInflater inflater;
private ArrayList<User> users; 
private ArrayList<User> usersFilter;
private DatabaseUser db;

public CustomAdapter(Context context, ArrayList<User> users){
    super(context, R.layout.design_list_user, users); //Lui transmettre le layout design de ta listeview
    db = new DatabaseUser(context);
    this.context = context;
    inflater = LayoutInflater.from(context);
    this.users = users;
    this.usersFilter= users;
}


private class ViewHolder{
    TextView name, phone, date;
    ImageView btnDial, btnMap, menuPoint;
}

 @Override
public Filter getFilter() {

    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {

            String charString = charSequence.toString();

            if (charString.isEmpty()) {

                users= usersFilter;
            } else {

                ArrayList<User> filteredList = new ArrayList<>();

                for (User user: usersFilter) {

                    if ( user.getYourField().toLowerCase().contains(charString)) {

                        filteredList.add(user);
                    }
                }

                users= filteredList;
            }

            FilterResults filterResults = new FilterResults();
            filterResults.values = users;
            return filterResults;
        }

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

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    final ViewHolder viewHolder;

    if(convertView == null){
        //Reglage general
        viewHolder = new ViewHolder();
        convertView = inflater.inflate(R.layout.design_list_user, parent, false); //Layout du design

        //Recuperation des ID
        viewHolder.name = convertView.findViewById(R.id.luPrenom);
        viewHolder.phone = convertView.findViewById(R.id.maTxtNumber);
        viewHolder.btnDial = convertView.findViewById(R.id.maBtnDial);
        viewHolder.btnMap = convertView.findViewById(R.id.maBtnMap);
        viewHolder.menuPoint = convertView.findViewById(R.id.luTrois);
        viewHolder.date = convertView.findViewById(R.id.maAdd);

        //Definition du tag
        convertView.setTag(viewHolder);

    }else{
        viewHolder = (ViewHolder) convertView.getTag();
    }

    //Definition des changements
    final User user = users.get(position);

    //On regle la taille du nom selon les caractere
    if(user.getName().length() == 15){
        viewHolder.name.setTextSize(24);
    }else if(user.getName().length() == 16){
        viewHolder.name.setTextSize(23);
    }else if(user.getName().length() == 17){
        viewHolder.name.setTextSize(22);
    }else if(user.getName().length() > 18){
        viewHolder.name.setTextSize(21);
    }
    viewHolder.name.setText(user.getName()); //Definition du nom


    //Definition de lajout ou modification
    String addOrUpdate = "Modifie le";
    viewHolder.date.setText(addOrUpdate + " " + user.getDate()); //Definition de la date
    viewHolder.date.setTextSize(15);



    //TODO Je dois regler ce probleme de zero ci dessous
    String phone = String.valueOf(user.getPhone());
    if(phone.equals("93260")){
        phone = "No number phone";
        viewHolder.phone.setTextSize(16);
    }else{
        phone = "0" + phone;
        viewHolder.phone.setTextSize(20);
    }
    viewHolder.phone.setText(phone);


    //OnClick sur les boutons
    viewHolder.btnDial.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
                    //TODO ICI Aussi Je dois regler ce probleme de zero ci dessous
                    Uri.parse("tel:0" + user.getPhone()));
            context.startActivity(intent); //Laligne la plus importante!!
        }
    });

    viewHolder.btnMap.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            adressMap(); //Fonction appel de louverture des map
        }
        public void adressMap() {
            String adress = user.getAdresse();
            String txtFind = " ";
            String txtReplace= "+";
            String tmp;

            int lgFind = txtFind.length();

            for (int k = 0; k < adress.length(); k++) {
                try {
                    tmp = adress.substring(k, k + lgFind);
                }
                catch(Exception e) {
                    break;
                }
                if ( tmp.equalsIgnoreCase(txtFind) ) {
                    adress = adress.substring(0, k) + txtReplace + adress.substring(k + lgFind,adress.length());
                }
            }

            Intent intent = new Intent(Intent.ACTION_VIEW,
                    Uri.parse("google.navigation:q=" +adress+ "+" + user.getCity()));
            context.startActivity(intent);
        } //Remplacement des espace par des "+"
    }); //Pour lancer la navigation



    //le menu a 3 points
    viewHolder.menuPoint.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            menuTroisPoint(viewHolder, user);
        }
    });


    return convertView;
}

public void menuTroisPoint(ViewHolder viewHolder, final User user) {
    PopupMenu popupMenu = new PopupMenu(context, viewHolder.menuPoint);

    popupMenu.getMenuInflater().inflate(R.menu.popup_menu, popupMenu.getMenu());

    popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
        @Override
        public boolean onMenuItemClick(MenuItem item) {
            Intent intent;
            switch (item.getItemId()){
                case R.id.menu_delete:
                    //Si il selectionne Delete on lui apparait un popup de securite
                    dialogConfirmDelete(user);
                    break;
                case R.id.menu_edit:
                    intentPageEdit(user); //Vers la page dedition
                    break;
                case R.id.menu_send:
                    popupSendSMS();
                    break;
            }
            return true;
        }
    });
    popupMenu.show();
}

public void popupSendSMS() {
    android.support.v7.app.AlertDialog.Builder cBuilder = new android.support.v7.app.AlertDialog.Builder(context);
    View mView = LayoutInflater.from(context).inflate(R.layout.custom_dialog_sms, null);

    RadioGroup rg = mView.findViewById(R.id.cdsRadioGroup);
    EditText inputPers = mView.findViewById(R.id.cdsInputPers);

    int radioId = rg.getCheckedRadioButtonId();

    if (radioId == R.id.cdsRadioPers) { //Cest le ID du RADIO LUI MEME
        inputPers.setEnabled(true); //TODO CORRIGER CE PROBLEME
    }

    cBuilder.setView(mView);
    android.support.v7.app.AlertDialog dialog = cBuilder.create();
    dialog.show();
}

public void dialogConfirmDelete(final User user) {
    AlertDialog.Builder popupSure = new AlertDialog.Builder(context); //On creer la fenetre
    popupSure.setTitle("Delete"); //Le titre de l'alerte
    popupSure.setMessage("Are you sure?");

    popupSure.setNegativeButton("CANCEL", null);  //Option cancel
    //Option OK
    popupSure.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            //On supprime lutilisateur selon le ID
            delete(user);
        }
    });  //Option ok
    popupSure.show(); //On fait apparaitre le popup
}

public void delete(User user) {
    db.delete((int)user.getId());
    Toast.makeText(context, "" + user.getName() + " deleted", Toast.LENGTH_SHORT).show();
    Intent intent = new Intent(context, MainActivity.class);
    context.startActivity(intent);
    ((Activity)context).finish();
} //Supprimer un user

public void intentPageEdit(User user) {
    Intent intent;
    intent = new Intent(context, AddUserActivity.class);
    Bundle args = new Bundle(); //On creer le bundle car cest un objet
    args.putSerializable("user", (user)); //On pose les donnees de l'intent pour le convertir en bundle en tant que objet
    intent.putExtra("BUNDLE", args); //On place les donnes enregistrer dans l'intent quon fera passe
    context.startActivity(intent);
} //Aller vers la page dedition


}

NOTE : Replace user.getYourField() with whatever field in your User class to check against the filter text you passed into the adapter

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM