Как передать намерение после применения фильтра поиска ListView к списку просмотра? - PullRequest
0 голосов
/ 11 сентября 2018

Я пытаюсь реализовать функцию просмотра списка в моем приложении для Android. Я применяю функцию прослушивания кликов к списку элементов, все работает нормально, и данные легко передаются в другое действие. Но также я использую функцию поиска в том же списке элементов поиска, поиск работает нормально, но после поиска, когда я нажимаю на элемент списка в списке поиска, он всегда открывает первый элемент в списке, например. если я ищу имя автомобиля Cultus в виде списка, то всегда открывается первый элемент. Вот мой код Код адаптера

открытый класс CarsAdapter расширяет возможности BaseAdapter Filterable {

Context context;
LayoutInflater inflater;
List<Cars> modellist;

ArrayList<Cars> filterList;

private ValueFilter valueFilter;
ArrayList<Cars> carsArrayList ;
private ArrayList<Cars> mStringFilterList;

public CarsAdapter(){}

public CarsAdapter(Activity context, ArrayList<Cars> _Cars) {
    super();
    this.context = context;
    this.carsArrayList = _Cars;
    mStringFilterList =  _Cars;
    this.inflater = (LayoutInflater) 
    context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    getFilter();
}

@Override
public int getCount() {
    return filterList.size();
}

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

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        convertView = inflater.inflate(R.layout.cars_item, parent, false);

        TextView carname = (TextView)
            convertView.findViewById(R.id.carName);

        TextView carmodal = (TextView)
            convertView.findViewById(R.id.carModal);


        TextView carPrice = (TextView)
            convertView.findViewById(R.id.carprice);


        TextView carstatus = (TextView)
            convertView.findViewById(R.id.carStatus);

        ImageView carimage = (ImageView)
        convertView.findViewById(R.id.carimage);



        carname.setText(carsArrayList.get(position).getCarname());
        carmodal.setText(carsArrayList.get(position).getCarmodal());
        carPrice.setText(carsArrayList.get(position).cardemand);
        carstatus.setText(carsArrayList.get(position).carstatus);

        return convertView;
}




@Override
public Filter getFilter() {
    if(valueFilter==null) {

        valueFilter=new ValueFilter();
    }

    return valueFilter;
}
private class ValueFilter extends Filter {

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        FilterResults results = new FilterResults();
        if (constraint != null && constraint.length() > 0) {
            filterList = new ArrayList<Cars>();
            for (int i = 0; i < mStringFilterList.size(); i++) {
                if ((mStringFilterList.get(i).getCarname().toUpperCase())
                        .contains(constraint.toString().toUpperCase())) {
                    Cars cars = new Cars();
                    cars.setCarname(mStringFilterList.get(i).getCarname());


                cars.setCarmodal(mStringFilterList.get(i).getCarmodal());
                cars.setCardemand(mStringFilterList.get(i).getCardemand());
                cars.setCarstatus(mStringFilterList.get(i).getCarstatus());

                    //  cars.se(mStringFilterList.get(i).getId());
                    filterList.add(cars);
                }
            }
            results.count = filterList.size();
            results.values = filterList;
        } else {
            results.count = mStringFilterList.size();
            results.values = mStringFilterList;
        }
        return results;
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint,
                                  FilterResults results) {
        carsArrayList = (ArrayList<Cars>) results.values;
        notifyDataSetChanged();
    }


}
}

1 Ответ

0 голосов
/ 11 сентября 2018

Добавьте это в свой конструктор:

this.filterList = _Cars;

Попробуйте этот фильтр:

@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            String charString = charSequence.toString();
            if (charString.isEmpty()) {
                filterList = carsArrayList;
            } else {
                ArrayList<Cars> filteredL = new ArrayList<>();
                for (Cars row : carsArrayList) {

                    // name match condition. this might differ depending on your requirement
                    // here we are looking for name or phone number match
                    if (row.getFlatName().toLowerCase().contains(charString.toLowerCase())) {
                        filteredL.add(row);
                    }
                }

                filterList = filteredL;
            }

            FilterResults filterResults = new FilterResults();
            filterResults.values = filterList;
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
            filterList = (ArrayList<Cars>) filterResults.values;
            notifyDataSetChanged();
        }
    };
}

Теперь, если вы используете getItem (position) для вашего адаптера, он дает вам точный объект

...