listview searchview android 不进行搜索
listview searchview android doesn't do search
所以问题是,当我输入内容时,它不会搜索。我需要它来进行基本搜索,比如当我输入字母或数字时,它会对其进行过滤。
这是我的适配器class:
public class KnjigeSearchAdapter extends ArrayAdapter<Knjiga> implements Filterable{
Context context;
private ArrayList<Knjiga> originalValues;
private NameFilter filter;
ArrayList<Knjiga> podaci = new ArrayList<>();
public KnjigeSearchAdapter(Context context,ArrayList<Knjiga> knjigas){
super(context, 0, knjigas);
this.context = context;
this.podaci = knjigas;
this.originalValues = new ArrayList<>();
this.originalValues.addAll(podaci);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Knjiga knjiga = getItem(position);
if (convertView == null){
convertView = LayoutInflater.from(getContext()).inflate(R.layout.search_knjiga_layout, parent, false);
}
TextView tvnazivK = (TextView)convertView.findViewById(R.id.textViewNazivKnjige);
TextView tvautorK = (TextView)convertView.findViewById(R.id.textViewAutorKnjige);
TextView tvisbn = (TextView)convertView.findViewById(R.id.textViewIsbnKnjige);
TextView tvGodina = (TextView)convertView.findViewById(R.id.textViewGodinaIzdKnjige);
TextView tvkatK = (TextView)convertView.findViewById(R.id.textViewKategorijaKnjige);
tvnazivK.setText(knjiga.getNaziv());
tvautorK.setText(knjiga.getAutor());
tvisbn.setText(knjiga.getIsbn());
tvGodina.setText(String.valueOf(knjiga.getGodinaIzdavanja()));
tvkatK.setText(knjiga.getKategorija());
return convertView;
}
@Override
public Filter getFilter() {
if(filter == null){
filter = new NameFilter();
}
return filter;
}
private class NameFilter extends Filter{
@Override
protected FilterResults performFiltering(CharSequence constraint) {
constraint = constraint.toString().toLowerCase();
FilterResults results = new FilterResults();
if(constraint != null && constraint.toString().length() > 0)
{
ArrayList<Knjiga> filtrirano = new ArrayList<>();
for(int i = 0, l = originalValues.size(); i < l; i++)
{
Knjiga knjiga = originalValues.get(i);
if(knjiga.toString().toLowerCase().contains(constraint))
filtrirano.add(knjiga);
}
results.count = filtrirano.size();
results.values = filtrirano;
}
else
{
synchronized(this)
{
results.values = originalValues;
results.count = originalValues.size();
}
}
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
podaci = (ArrayList<Knjiga>)results.values;
notifyDataSetChanged();
clear();
for(int i = 0, l = podaci.size(); i < l; i++)
add(podaci.get(i));
notifyDataSetInvalidated();
}
}
}
这是我的 Activity class:
public class KorisnikSearchKnjigeActivity extends AppCompatActivity {
ListView lvPretragaknjiga;
SearchView svSearch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_korisnik_search_knjige);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
pretragaKnjiga();
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void pretragaKnjiga() {
lvPretragaknjiga = (ListView) findViewById(R.id.listViewListaKnjiga);
svSearch = (SearchView) findViewById(R.id.searchViewSearch);
MyDBHelper helper = new MyDBHelper(this);
final KnjigeSearchAdapter adapter = new KnjigeSearchAdapter(this, helper.getAllKnjige());
lvPretragaknjiga.setAdapter(adapter);
svSearch.setOnQueryTextListener(
new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return true;
}
}
);
}
}
问题可能是您通过将 Kijiga.toString()
与您键入的内容进行比较来进行过滤,并且它可能没有您认为的 "content" 字符串。看看是什么toString returns,大概是这样的:“[Kijiga#1345]”。您可能想使用一些 getter 而不是 toString。或者重写 toString.
也可以尝试改:
public boolean onQueryTextSubmit(String query) {
adapter.getFilter().filter(query);
return true;
}
而且恕我直言,模拟器中存在一个错误,因此它并不总是有效(取决于硬件键盘设置),因此请在真实设备上进行测试!
所以问题是,当我输入内容时,它不会搜索。我需要它来进行基本搜索,比如当我输入字母或数字时,它会对其进行过滤。
这是我的适配器class:
public class KnjigeSearchAdapter extends ArrayAdapter<Knjiga> implements Filterable{
Context context;
private ArrayList<Knjiga> originalValues;
private NameFilter filter;
ArrayList<Knjiga> podaci = new ArrayList<>();
public KnjigeSearchAdapter(Context context,ArrayList<Knjiga> knjigas){
super(context, 0, knjigas);
this.context = context;
this.podaci = knjigas;
this.originalValues = new ArrayList<>();
this.originalValues.addAll(podaci);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Knjiga knjiga = getItem(position);
if (convertView == null){
convertView = LayoutInflater.from(getContext()).inflate(R.layout.search_knjiga_layout, parent, false);
}
TextView tvnazivK = (TextView)convertView.findViewById(R.id.textViewNazivKnjige);
TextView tvautorK = (TextView)convertView.findViewById(R.id.textViewAutorKnjige);
TextView tvisbn = (TextView)convertView.findViewById(R.id.textViewIsbnKnjige);
TextView tvGodina = (TextView)convertView.findViewById(R.id.textViewGodinaIzdKnjige);
TextView tvkatK = (TextView)convertView.findViewById(R.id.textViewKategorijaKnjige);
tvnazivK.setText(knjiga.getNaziv());
tvautorK.setText(knjiga.getAutor());
tvisbn.setText(knjiga.getIsbn());
tvGodina.setText(String.valueOf(knjiga.getGodinaIzdavanja()));
tvkatK.setText(knjiga.getKategorija());
return convertView;
}
@Override
public Filter getFilter() {
if(filter == null){
filter = new NameFilter();
}
return filter;
}
private class NameFilter extends Filter{
@Override
protected FilterResults performFiltering(CharSequence constraint) {
constraint = constraint.toString().toLowerCase();
FilterResults results = new FilterResults();
if(constraint != null && constraint.toString().length() > 0)
{
ArrayList<Knjiga> filtrirano = new ArrayList<>();
for(int i = 0, l = originalValues.size(); i < l; i++)
{
Knjiga knjiga = originalValues.get(i);
if(knjiga.toString().toLowerCase().contains(constraint))
filtrirano.add(knjiga);
}
results.count = filtrirano.size();
results.values = filtrirano;
}
else
{
synchronized(this)
{
results.values = originalValues;
results.count = originalValues.size();
}
}
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
podaci = (ArrayList<Knjiga>)results.values;
notifyDataSetChanged();
clear();
for(int i = 0, l = podaci.size(); i < l; i++)
add(podaci.get(i));
notifyDataSetInvalidated();
}
}
}
这是我的 Activity class:
public class KorisnikSearchKnjigeActivity extends AppCompatActivity {
ListView lvPretragaknjiga;
SearchView svSearch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_korisnik_search_knjige);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
pretragaKnjiga();
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void pretragaKnjiga() {
lvPretragaknjiga = (ListView) findViewById(R.id.listViewListaKnjiga);
svSearch = (SearchView) findViewById(R.id.searchViewSearch);
MyDBHelper helper = new MyDBHelper(this);
final KnjigeSearchAdapter adapter = new KnjigeSearchAdapter(this, helper.getAllKnjige());
lvPretragaknjiga.setAdapter(adapter);
svSearch.setOnQueryTextListener(
new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return true;
}
}
);
}
}
问题可能是您通过将 Kijiga.toString()
与您键入的内容进行比较来进行过滤,并且它可能没有您认为的 "content" 字符串。看看是什么toString returns,大概是这样的:“[Kijiga#1345]”。您可能想使用一些 getter 而不是 toString。或者重写 toString.
也可以尝试改:
public boolean onQueryTextSubmit(String query) {
adapter.getFilter().filter(query);
return true;
}
而且恕我直言,模拟器中存在一个错误,因此它并不总是有效(取决于硬件键盘设置),因此请在真实设备上进行测试!