SearchView показывает только одну и ту же запись из listView с CustomAdapter, но searchView отлично работает с ArrayAdapter.Вот мой адаптер - PullRequest
0 голосов
/ 14 мая 2018
import com.example.mis_internee.atendence_app_android.R;


    public class EMP_LEAVE_ADAPTER extends ArrayAdapter<String> {

        private final Activity context;
        private final String[] itemname;

        public EMP_LEAVE_ADAPTER(Activity context, String[] itemname) {
            super(context, R.layout.mylist, itemname);
            // TODO Auto-generated constructor stub

            this.context = context;
            this.itemname = itemname;


        }
        public View getView(int position, View view, ViewGroup parent) {
            LayoutInflater inflater=context.getLayoutInflater();
            View rowView=inflater.inflate(R.layout.emp_leave_adpater_layout, null,true);

            TextView txtTitle = (TextView) rowView.findViewById(R.id.item);
            ImageView image=(ImageView)rowView.findViewById(R.id.icon);

            txtTitle.setText(itemname[position]);
            return rowView;

        };
    }

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Вам необходимо вернуть другое представление, а также вам необходимо вручную перезапустить представление следующим образом:

 public View getView(int position, View view, ViewGroup parent) {
 ViewHolder viewHolder;
 if(view == null) {
   viewHolder = new ViewHolder();
   LayoutInflater inflater=context.getLayoutInflater();
   View rowView=inflater.inflate(R.layout.emp_leave_adpater_layout, null,true);

  viewHolder.txtTitle = (TextView) rowView.findViewById(R.id.item);
  viewHolder.image=(ImageView)rowView.findViewById(R.id.icon);
  view.setTag(viewHolder);
    } else {
      viewHolder = (ViewHolder) view.getTag();
    }   
  viewHolder.txtTitle.setText(itemname[position]);

  return viewHolder;
};


public class viewholder {

 public TextView txtTitle;
 public ImageView image;
}
0 голосов
/ 14 мая 2018

Вы должны реализовать класс фильтра в своем настраиваемом адаптере и вызвать этот метод из своего класса, посмотрите

в своем адаптере:

 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();
        }

    }
}

Теперь в вашей деятельности, гдетекст редактирования определен:

editTxt.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        System.out.println("Text ["+s+"]");

        mSearchableAdapter.getFilter().filter(s.toString());                           
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {

    }

    @Override
    public void afterTextChanged(Editable s) {
    }
});

изменить в соответствии с вашими требованиями, надеюсь, это поможет вам !!

...