ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • EditText로 ListView 필터링
    카테고리 없음 2020. 8. 15. 12:44

    질문

    EditText 의 텍스트로 ListView 를 필터링하려고하는데 필터가 전혀 나타나지 않습니다.이 답변을 따르고 있습니다 : 답변 .내 어댑터 class는 BaseAdapter 를 확장하고 Filterable 을 구현하며 다음과 같습니다.

    public class ListBaseAdapter extends BaseAdapter implements Filterable {
    
    
        Context context;
        ArrayList<Bean> bean;
        ArrayList<Bean> beanFiltered;
        Typeface fonts1, fonts2;
    
    
        public ListBaseAdapter(Context context, ArrayList<Bean> bean) {
    
            this.context = context;
            this.bean = bean;
            this.beanFiltered = bean;
        }
    
    
        @Override
        public int getCount() {
            return bean.size();
        }
    
        @Override
        public Object getItem(int position) {
            return bean.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
    
            fonts1 = Typeface.createFromAsset(context.getAssets(),
                    "fonts/Lato-Light.ttf");
    
            fonts2 = Typeface.createFromAsset(context.getAssets(),
                    "fonts/Lato-Regular.ttf");
    
            ViewHolder viewHolder = null;
    
            if (convertView == null) {
                LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
                convertView = layoutInflater.inflate(R.layout.list, null);
    
                viewHolder = new ViewHolder();
    
                viewHolder.newsimage1 = convertView.findViewById(R.id.newsimage1);
                viewHolder.newsimage2 = convertView.findViewById(R.id.newsimage2);
                viewHolder.more = convertView.findViewById(R.id.more);
                viewHolder.newsname = convertView.findViewById(R.id.newsname);
                viewHolder.time = convertView.findViewById(R.id.time);
                viewHolder.news = convertView.findViewById(R.id.news);
                viewHolder.newssub = convertView.findViewById(R.id.newssub);
                viewHolder.intrest = convertView.findViewById(R.id.intrest);
    
    
                viewHolder.newsname.setTypeface(fonts1);
                viewHolder.time.setTypeface(fonts1);
                viewHolder.news.setTypeface(fonts2);
                viewHolder.newssub.setTypeface(fonts1);
                viewHolder.intrest.setTypeface(fonts1);
    
                convertView.setTag(viewHolder);
    
    
            } else {
    
                viewHolder = (ViewHolder) convertView.getTag();
            }
    
    
            final Bean bean = (Bean) getItem(position);
    
            viewHolder.newsimage1.setImageResource(bean.getNewsimage1());
            viewHolder.newsimage2.setImageResource(bean.getNewsimage2());
            viewHolder.more.setImageResource(bean.getMore());
            viewHolder.newsname.setText(bean.getNewsname());
            viewHolder.time.setText(bean.getTime());
            viewHolder.news.setText(bean.getNews());
            viewHolder.newssub.setText(bean.getNewssub());
            viewHolder.intrest.setText(bean.getIntrest());
            convertView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(context, ItemDetailActivity.class);
                    intent.putExtra("text", bean.getNewssub());
                    context.startActivity(intent);
                }
            });
    
    
            return convertView;
        }
    
        @Override
        public Filter getFilter() {
            return new Filter() {
                @Override
                protected FilterResults performFiltering(CharSequence constraint) {
                    FilterResults results = new FilterResults();
                    if (constraint == null || constraint.length() == 0) {
                        //no constraint given, just return all the data. (no search)
                        results.count = bean.size();
                        results.values = bean;
                    } else {//do the search
                        List<Bean> resultsData = new ArrayList<>();
                        String searchStr = constraint.toString();
                        for (Bean o : bean)
                            if (o.getNews().startsWith(searchStr)) resultsData.add(o);
                        results.count = resultsData.size();
                        results.values = resultsData;
                    }
                    return results;
                }
    
                @Override
                protected void publishResults(CharSequence constraint, FilterResults results) {
                    beanFiltered = (ArrayList<Bean>) results.values;
                    notifyDataSetChanged();
                }
            };
        }
    
        private class ViewHolder {
    
            ImageView newsimage1;
            ImageView newsimage2;
            ImageView more;
            TextView newsname;
            TextView time;
            TextView news;
            TextView newssub;
            TextView intrest;
    
    
        }
    }

    그런 다음 내 Activity에서 :

      searchParam.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
                }
    
                @Override
                public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                    baseAdapter.getFilter().filter(charSequence);
                }
    
                @Override
                public void afterTextChanged(Editable editable) {
    
                }
            });

    그러나 여전히 필터링 된 결과를 얻지 못합니다. 내가 뭘 잘못하고 있죠


    답변1

    beanFiltered 가 아닌 bean 을 기반으로하는 목록입니다. 그래서 notifyDataSetChanged 가 작동하지 않습니다. getCount () getItem (int position) 은 항상 bean 에서 작동합니다. 그래서 필터가 작동하지 않습니다. 아래에 따라 변경하십시오 :

    @Override
    public int getCount() {
        return beanFiltered.size();
    }
    
    @Override
    public Object getItem(int position) {
        return beanFiltered.get(position);
    }


     

     

     

     

    출처 : https://stackoverflow.com/questions/58282399/filter-listview-with-edittext

    댓글

Designed by Tistory.