Как использовать функцию поиска в пользовательском представлении списка в Android

Я создал представление списка с несколькими элементами в строке. Я также создал окно поиска выше. Я хочу реализовать функцию поиска на основе конкретных полей списка. Как я могу это достичь? Любая помощь будет оценена.

Для этого вам нужно использовать модель, listview и customadapter с фильтрацией. Я создал демо для этого.

Предположим, что у вас есть модель с именем Product, и вы показываете ее содержимое в пользовательском списке, где имя и цена отображаются в текстовом виде. Я имею в виду в пользовательской строке, имеющей два текстовых поля, и вы хотите отфильтровать список по одному из полей пользовательской строки. Здесь я отфильтровал «имя»,

Скриншоты:

начальный

начальный

отфильтрованный

отфильтрованный

Исходный код

Модель

public class Product { public String name; public Integer price; public Product(String name, Integer price) { super(); this.name = name; this.price = price; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getPrice() { return price; } public void setPrice(Integer price) { this.price = price; } } 

Активность с пользовательским адаптером и списком

 public class MainActivity extends Activity { private LinearLayout llContainer; private EditText etSearch; private ListView lvProducts; private ArrayList mProductArrayList = new ArrayList(); private MyAdapter adapter1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initialize(); // Add Text Change Listener to EditText etSearch.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // Call back the Adapter with current character to Filter adapter1.getFilter().filter(s.toString()); } @Override public void beforeTextChanged(CharSequence s, int start, int count,int after) { } @Override public void afterTextChanged(Editable s) { } }); } private void initialize() { etSearch = (EditText) findViewById(R.id.etSearch); lvProducts = (ListView)findViewById(R.id.lvOS); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); mProductArrayList.add(new Product("a", 100)); mProductArrayList.add(new Product("b", 200)); mProductArrayList.add(new Product("c", 300)); mProductArrayList.add(new Product("d", 400)); mProductArrayList.add(new Product("e", 500)); mProductArrayList.add(new Product("f", 600)); mProductArrayList.add(new Product("g", 700)); mProductArrayList.add(new Product("h", 800)); mProductArrayList.add(new Product("i", 900)); mProductArrayList.add(new Product("j", 1000)); mProductArrayList.add(new Product("k", 1100)); mProductArrayList.add(new Product("l", 1200)); mProductArrayList.add(new Product("m", 1000)); mProductArrayList.add(new Product("n", 1300)); mProductArrayList.add(new Product("o", 1400)); mProductArrayList.add(new Product("p", 1500)); adapter1 = new MyAdapter(MainActivity.this, mProductArrayList); lvProducts.setAdapter(adapter1); } // Adapter Class public class MyAdapter extends BaseAdapter implements Filterable { private ArrayList mOriginalValues; // Original Values private ArrayList mDisplayedValues; // Values to be displayed LayoutInflater inflater; public MyAdapter(Context context, ArrayList mProductArrayList) { this.mOriginalValues = mProductArrayList; this.mDisplayedValues = mProductArrayList; inflater = LayoutInflater.from(context); } @Override public int getCount() { return mDisplayedValues.size(); } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } private class ViewHolder { LinearLayout llContainer; TextView tvName,tvPrice; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = inflater.inflate(R.layout.row, null); holder.llContainer = (LinearLayout)convertView.findViewById(R.id.llContainer); holder.tvName = (TextView) convertView.findViewById(R.id.tvName); holder.tvPrice = (TextView) convertView.findViewById(R.id.tvPrice); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.tvName.setText(mDisplayedValues.get(position).name); holder.tvPrice.setText(mDisplayedValues.get(position).price+""); holder.llContainer.setOnClickListener(new OnClickListener() { public void onClick(View v) { Toast.makeText(MainActivity.this, mDisplayedValues.get(position).name, Toast.LENGTH_SHORT).show(); } }); return convertView; } @Override public Filter getFilter() { Filter filter = new Filter() { @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint,FilterResults results) { mDisplayedValues = (ArrayList) results.values; // has the filtered values notifyDataSetChanged(); // notifies the data with new filtered values } @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); // Holds the results of a filtering operation in values ArrayList FilteredArrList = new ArrayList(); if (mOriginalValues == null) { mOriginalValues = new ArrayList(mDisplayedValues); // saves the original data in mOriginalValues } /******** * * If constraint(CharSequence that is received) is null returns the mOriginalValues(Original) values * else does the Filtering and returns FilteredArrList(Filtered) * ********/ if (constraint == null || constraint.length() == 0) { // set the Original result to return results.count = mOriginalValues.size(); results.values = mOriginalValues; } else { constraint = constraint.toString().toLowerCase(); for (int i = 0; i < mOriginalValues.size(); i++) { String data = mOriginalValues.get(i).name; if (data.toLowerCase().startsWith(constraint.toString())) { FilteredArrList.add(new Product(mOriginalValues.get(i).name,mOriginalValues.get(i).price)); } } // set the Filtered result to return results.count = FilteredArrList.size(); results.values = FilteredArrList; } return results; } }; return filter; } } } 

activity_main.xml

      

row.xml

      

для этого вам сначала нужно добавить edittext, где вы будете печатать, чтобы фильтровать данные из списка,

затем включить фильтрацию в списке,

 editText = (EditText) findViewById(R.id.searchList); adapter = new CustomListViewAdapter(this, R.layout.list_row, rowItems); listView.setAdapter(adapter); listView.setTextFilterEnabled(true); 

Затем вам нужно добавить TextChangeListener() для edittext,

 editText.addTextChangedListener(new TextWatcher() { public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } public void afterTextChanged(Editable arg0) { MyActivityName.this.adapter.getFilter().filter(arg0); } }); 

Используйте метод ниже.

 your edit text box.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable theWatchedText) { } }); } 

Вы можете установить TextWatcher для своего windows поиска и сменить курсор на onTextChanged () на TextWatcher, например, на коды ниже:

 TextWatcher filterNameTextWatcher = new TextWatcher() public void beforeTextChanged(CharSequence s, int start, int count,int after) { } public void onTextChanged(CharSequence s,int start, int before,int count) { Cursor FilteredNameList = ZoneCardDBAdapter.instance.CursorFilteredName(s.toString()); Listadapter.changeCursor(FilteredNameList); } @Override public void afterTextChanged(Editable arg0) { } }; EditText filterTextName = (EditText)this.findViewById(R.id.edtZoneCardNameFilter); filterTextCPName.addTextChangedListener(filterNameTextWatcher); 
  • Регистрация кнопки гарнитуры с помощью BroadcastReceiver на Android
  • Диалоги / AlertDialogs: как «блокировать выполнение» при диалоге вверх (стиль .NET)
  • Android: как обращаться с кнопкой
  • Как добавить ярлык приложения на рабочий стол при установке приложения?
  • BroadcastReceiver не получает BOOT_COMPLETED
  • Android canvas: рисовать прозрачный круг на изображении
  • Новый знак Google в Android
  • Android - android.view.InflateException: двоичная строка XML-файла # 8: ошибка раздувания fragmentа classа
  • Как исправить ошибку «процесс - это плохо» для Android-виджета?
  • Android: как я могу получить текущее открытое имя приложения на экране?
  • Android: не может заменить один fragment другим
  • Давайте будем гением компьютера.