Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

вам нужно использовать модель, listview и customadapter с фильтрацией для этого. Я создал демо для этого, предположим, что у вас есть модель с именем Product, и вы показываете ее содержимое в пользовательском списке, где имя, цена отображаются в текстовом виде. Я имею в виду пользовательскую строку с двумя текстовыми полями и вы хотите фильтровать список одним из полей пользовательской строки. Где я отфильтрован с именем "<имя >

Скриншоты:

Начальное

Initial

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

Filtered

Исходный код

//это ваша модель

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<Product> mProductArrayList = new ArrayList<Product>();
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<Product> mOriginalValues; // Original Values
private ArrayList<Product> mDisplayedValues;    // Values to be displayed
LayoutInflater inflater;

public MyAdapter(Context context, ArrayList<Product> 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<Product>) 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<Product> FilteredArrList = new ArrayList<Product>();

            if (mOriginalValues == null) {
                mOriginalValues = new ArrayList<Product>(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

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<EditText 
    android:id="@+id/etSearch"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />
<ListView 
    android:id="@+id/lvProducts"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"

    ></ListView>    

</LinearLayout>

//это ваш row.xml

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/llContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >


    <TextView 
        android:id="@+id/tvName"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:layout_weight="1"
        />
    <TextView 
        android:id="@+id/tvPrice"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:layout_weight="1"
        />


</LinearLayout>

Ответ 2

для этого вам сначала нужно добавить 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);

            }
        });

Ответ 3

Вы можете установить TextWatcher для своего окна поиска и сменить курсор на 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);

Ответ 4

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

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) {

            }
        });

    }