У меня есть Listview в моей asynctask, и я настраиваю адаптер. Я должен реализовать функцию полного автопоиска. Мои коды работают нормально, но список не фильтруется, когда я ввожу текст в редактируемом текстовом окне.

@Override
protected void onPostExecute(ArrayList<RouteTrackerUser> result) 
{
    dialog.dismiss();
    if(result!=null)
    {   
         //System.out.println("User with result===>"+result);
         /*for(RouteTrackerUser r :result ){
             System.out.println("Contents===>"+r.getStoreid()+" "+r.getStorename()+" "+r.getStorecode()+" "+r.getStoreno()+" "+r.getVisitcount());}
        */   Intent intent=getIntent();
             TextView username=(TextView)findViewById(R.id.usrname);
             final String sname=intent.getExtras().getString("user_name");
             username.setText("Welcome, "+sname);
             userList = (ListView) findViewById(R.id.historylist);
             userAdapter = new HistoryAdapter(History.this, R.layout.history_visits,R.id.vcount,result);
             userList.setAdapter(userAdapter);
             EditText inputSearch = (EditText) findViewById(R.id.autocomplete);
             inputSearch.addTextChangedListener(new TextWatcher() {

                @Override
                public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                    // When user changed the Text
                    System.out.println("afafasdf"+cs);
                    History.this.userAdapter.getFilter().filter(cs);    
                }

                @Override
                public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                        int arg3) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void afterTextChanged(Editable arg0) {
                    // TODO Auto-generated method stub                          
                }
            });      
        }

А мой customAdapter выглядит следующим образом:

private static class ViewHolder {
    public final TextView storename;
    public final TextView storevisitcount;

    public ViewHolder(TextView name, TextView count) {
        this.storename = name;
        this.storevisitcount = count;
    }
}
public class HistoryAdapter extends ArrayAdapter<RouteTrackerUser>
{
Context context;
//EditText autocomplete;
public HistoryAdapter(Context context,int resource,int textViewResourceId,ArrayList<RouteTrackerUser> result) {
    super(context,resource,textViewResourceId, result);
    this.context=context;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    TextView name;
    TextView vcount;
    final RouteTrackerUser User = getItem(position);
    if (convertView == null) {
        LayoutInflater inflater = LayoutInflater.from(context);
        convertView = inflater.inflate(R.layout.history_visits, parent, false);
        name = (TextView) convertView.findViewById(R.id.sname);
        vcount = (TextView) convertView.findViewById(R.id.vcount);
        convertView.setTag(new ViewHolder(name, vcount));
        convertView.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                // TODO Auto-generated method stub
                viewdata(User.getUsername(),User.getUid(),User.getStoreid(),User.getStorename(),User.getStorecode(),User.getStoreno(),User.getVisitcount());
            }});
    } else {
        ViewHolder viewHolder = (ViewHolder) convertView.getTag();
        name = viewHolder.storename;
        vcount = viewHolder.storevisitcount;
    }

    name.setText(User.getStorename());
    vcount.setText("Visit Count: "+User.getVisitcount());
    return convertView;
}

  }

Примечание. Имя моего основного класса - History.java, а имя Asynctask - HistorySoapTask.

0
arun 14 Фев 2014 в 16:07

1 ответ

Лучший ответ

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

private class OrderAdapterFilter extends Filter
{
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        constraint = constraint.toString().toLowerCase();
        FilterText = (String) constraint;
        FilterResults result = new FilterResults();
        if(constraint != null && constraint.toString().length() > 0)
        {
            ArrayList<RouteTrackerUser> filt = new ArrayList<RouteTrackerUser>();
            ArrayList<RouteTrackerUser> lItems = new ArrayList<RouteTrackerUser>(fullitems);
            for(int i = 0, l = lItems.size(); i < l; i++)
            {
                RouteTrackerUser m = lItems.get(i);
                if(m.getStorename().toLowerCase().contains(constraint))
                    filt.add(m);
            }
            result.count = filt.size();
            result.values = filt;
        }
        else
        {
            ArrayList<RouteTrackerUser> list = new ArrayList<RouteTrackerUser>(fullitems);
            result.values = list;
            result.count = list.size();
        }
        return result;
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        // NOTE: this function is *always* called from the UI thread.
        filtered = (ArrayList<RouteTrackerUser>)results.values;
        originalitems.clear();
        for(int i = 0, l = filtered.size(); i < l; i++)
          originalitems.add(filtered.get(i));

        notifyDataSetChanged();
    }
}
0
arun 21 Фев 2014 в 10:27