[英]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 我有一个自定义的listview,其中包含一个对象类型Arraylist,在同一活动中,我有一个SearchView,如何根据关键字例如getName(),getCity()来搜索和仅显示对象,...在这里,我的代码,我的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 : 在适配器类中再添加一个arraylist
,并使适配器implements Filterable
,尝试如下更改适配器:
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 注意 :将user.getYourField()
替换为User
类中的任何字段,以检查传递给适配器的过滤器文本
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.