【问题标题】:EditText for filtering/searching listViewEditText 用于过滤/搜索 listView
【发布时间】:2016-04-30 03:58:53
【问题描述】:

我是编程新手,在教程的帮助下我创建了一个应用程序,您可以在其中创建货架并将它们存储在 sqlite 数据库中。在列表视图的帮助下,将显示架子。现在我在 ListView 顶部设置了一个 EditText,并使用 stackoverflow 尝试实现“动态过滤”。我认为使用“addTextChangedListener”可以做到这一点,但它根本不起作用。我尝试了近 10 种不同的方法和 4 种不同的其他教程,日日夜夜都在尝试,但没有任何效果。希望你们能帮助我。

谢谢

按照我的 DataListActivity 代码:

import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Typeface;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import com.kasutwentyseven.gui4selfshelf.R;
import com.kasutwentyseven.gui4selfshelf.Scans.ScanActivity;

public class DataListActivity extends Activity {
public ListView listView;
public SQLiteDatabase sqLiteDatabase;
public ShelfDBHelper shelfDBHelper;
public Cursor cursor;
public EditText inputSearch;
public ListDataAdapter listDataAdapter; //DataSource - Adapter

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.data_list_layout);

    Typeface myTypeface = Typeface.createFromAsset(getAssets(), "Lobster.ttf");
    TextView myTextView = (TextView) findViewById(R.id.text_yourshelfs);
    myTextView.setTypeface(myTypeface);

    listView = (ListView) findViewById(R.id.list_view);
    listDataAdapter = new ListDataAdapter(getApplicationContext(), R.layout.row_layout); //ArrayAdapter

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


    listView.setAdapter(listDataAdapter);
    inputSearch.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int arg1, int arg2, int arg3) {
            listDataAdapter.getFilter().filter(s);
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
        }

        @Override
        public void afterTextChanged(Editable arg0) {

        }
    });

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Intent n = new Intent(getApplicationContext(), ScanActivity.class);
            n.putExtra("postition", position);
            startActivity(n);

shelfDBHelper = new ShelfDBHelper(getApplicationContext());
    sqLiteDatabase = shelfDBHelper.getReadableDatabase();
    cursor = shelfDBHelper.getInformations(sqLiteDatabase);
    if (cursor.moveToFirst()) {
        do {
            String name;

            name = cursor.getString(0);

            DataProvider dataProvider = new DataProvider(name);
            listDataAdapter.add(dataProvider);
        } while (cursor.moveToNext());
    }


}

还有我的适配器的代码:

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import com.kasutwentyseven.gui4selfshelf.R;

import java.sql.SQLDataException;
import java.util.ArrayList;
import java.util.List;

public class ListDataAdapter extends ArrayAdapter{
private List list= new ArrayList();
private static final String TAG = "Shelf ADAPTER";
private ShelfDBHelper shelfDBHelper;
private SQLiteDatabase sqLiteDatabase;

public ListDataAdapter(Context context, int resource) {
    super(context, resource);
}
static class LayoutHandler
{
    TextView NAME;
}
@Override
public void add(Object object){
    super.add(object);
    list.add(object);
}
@Override
public int getCount(){
    return list.size();
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    LayoutHandler layoutHandler;
    if(row == null){
        LayoutInflater layoutInflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = layoutInflater.inflate(R.layout.row_layout,parent,false);
        layoutHandler = new LayoutHandler();
        layoutHandler.NAME = (TextView)row.findViewById(R.id.text_shelf_name);
        row.setTag(layoutHandler);
    }else{
        layoutHandler = (LayoutHandler) row.getTag();

    }

    DataProvider dataProvider = (DataProvider)this.getItem(position);
    layoutHandler.NAME.setText(dataProvider.getName());

    return row;
}

【问题讨论】:

    标签: android sqlite listview search filter


    【解决方案1】:

    看看这个库 https://github.com/edsilfer/custom-searchable ,它会做你想做的事,此外它还为你的应用带来了漂亮的动画。

    【讨论】:

      【解决方案2】:

      当您使用自定义适配器时,您需要在其中实现过滤器。您采用的方法适用于 android 默认适配器。

      自定义过滤器的代码是

      public class SearchableAdapter extends BaseAdapter implements Filterable {
      
      private List<String>originalData = null;
      private List<String>filteredData = null;
      private LayoutInflater mInflater;
      private ItemFilter mFilter = new ItemFilter();
      
      public SearchableAdapter(Context context, List<String> data) {
          this.filteredData = data ;
          this.originalData = data ;
          mInflater = LayoutInflater.from(context);
      }
      
      public int getCount() {
          return filteredData.size();
      }
      
      public Object getItem(int position) {
          return filteredData.get(position);
      }
      
      public long getItemId(int position) {
          return position;
      }
      
      public View getView(int position, View convertView, ViewGroup parent) {
          // A ViewHolder keeps references to children views to avoid unnecessary calls
          // to findViewById() on each row.
          ViewHolder holder;
      
          // When convertView is not null, we can reuse it directly, there is no need
          // to reinflate it. We only inflate a new View when the convertView supplied
          // by ListView is null.
          if (convertView == null) {
              convertView = mInflater.inflate(R.layout.list_item, null);
      
              // Creates a ViewHolder and store references to the two children views
              // we want to bind data to.
              holder = new ViewHolder();
              holder.text = (TextView) convertView.findViewById(R.id.list_view);
      
              // Bind the data efficiently with the holder.
      
              convertView.setTag(holder);
          } else {
              // Get the ViewHolder back to get fast access to the TextView
              // and the ImageView.
              holder = (ViewHolder) convertView.getTag();
          }
      
          // If weren't re-ordering this you could rely on what you set last time
          holder.text.setText(filteredData.get(position));
      
          return convertView;
      }
      
      static class ViewHolder {
          TextView text;
      }
      
      public Filter getFilter() {
          return mFilter;
      }
      
      private class ItemFilter extends Filter {
          @Override
          protected FilterResults performFiltering(CharSequence constraint) {
      
              String filterString = constraint.toString().toLowerCase();
      
              FilterResults results = new FilterResults();
      
              final List<String> list = originalData;
      
              int count = list.size();
              final ArrayList<String> nlist = new ArrayList<String>(count);
      
              String filterableString ;
      
              for (int i = 0; i < count; i++) {
                  filterableString = list.get(i);
                  if (filterableString.toLowerCase().contains(filterString)) {
                      nlist.add(filterableString);
                  }
              }
      
              results.values = nlist;
              results.count = nlist.size();
      
              return results;
          }
      
          @SuppressWarnings("unchecked")
          @Override
          protected void publishResults(CharSequence constraint, FilterResults results) {
              filteredData = (ArrayList<String>) results.values;
              notifyDataSetChanged();
          }
      
      }
      }
      

      代码取自https://gist.github.com/fjfish/3024308 这里。您也可以在此处查看完整的参考资料。

      【讨论】:

      • 那么,我必须编辑我的 Adapterclass 还是必须设置一个新的 SearchAdapterclass ?
      • 我复制了您的 SearchableAdapter 代码并进行了一些配置。但现在我收到一个错误@my DatalistActivtiy @cursor =shelfDBHelper.getInformations(sqLiteDatabase); if (cursor.moveToFirst()) { 做 { 字符串名称;名称 = cursor.getString(0); DataProvider dataProvider = new DataProvider(name); listDataAdapter.add(dataProvider); } while (cursor.moveToNext()); } @ 行 listDataAdaptder.add(dataProvider); //add 是红色的 它说:Cannot resolve method add
      猜你喜欢
      • 1970-01-01
      • 2018-09-24
      • 2013-08-04
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 2017-12-12
      相关资源
      最近更新 更多