如何在Android中过滤自定义ListView

时间:2018-07-19 11:50:54

标签: java android listview filter

添加了可过滤的接口,但它只是刷新ListView但不过滤 listView项目

有许多解决方案可以解决此问题,但是我并没有确切地找到问题所在。我有一个自定义适配器,我想过滤其项目

ListAdapter.class

class ListAdapter extends ArrayAdapter<DataModel> implements View.OnClickListener, Filterable{
    private ArrayList<DataModel> dataSet;
    private ArrayList<DataModel> newDataset;
    Context mContext;
    public ListAdapter(ArrayList<DataModel> data, Context context) {
        super(context, R.layout.model, data);
        this.dataSet = data;
        this.newDataset = data;
        this.mContext = context;}
    private static class ViewHolder {
        TextView mt1;
        TextView mt2;
        TextView mt3;
        TextView mt4;
        ImageView mimg;
        RelativeLayout layout;
    }
    @Override
    public void onClick(View v) {
        int position = (Integer) v.getTag();
        Object object = getItem(position);
        DataModel dataModel = (DataModel) object;
        switch (v.getId()) {

            case R.id.img:
                Snackbar.make(v, "Release date " + dataModel.getId(), Snackbar.LENGTH_LONG)
                        .setAction("No action", null).show();
                break;
        }
    }
    private int lastPosition = -1;
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        DataModel dataModel = getItem(position);
        ViewHolder viewHolder;  
        final View result;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            LayoutInflater inflater = LayoutInflater.from(getContext());
            convertView = inflater.inflate(R.layout.model, parent, false);
            viewHolder.mt1 = convertView.findViewById(R.id.name);
            viewHolder.mt2 = (TextView) convertView.findViewById(R.id.price);
            viewHolder.mt3 = (TextView) convertView.findViewById(R.id.incdec);
            viewHolder.mt4 = (TextView) convertView.findViewById(R.id.dt);
            viewHolder.mimg = (ImageView) convertView.findViewById(R.id.img);
            viewHolder.layout = convertView.findViewById(R.id.layout);
            result = convertView;
            convertView.setTag(viewHolder);
        }
        else
        {
            viewHolder = (ViewHolder) convertView.getTag();
            result = convertView;
        }
        Animation animation = AnimationUtils.loadAnimation(mContext, (position > lastPosition) ? R.anim.up_from_bottom : R.anim.down_from_top);
        result.startAnimation(animation);
        lastPosition = position;
        viewHolder.mt1.setText(dataModel.getName());
        viewHolder.mt2.setText("$ : "+dataModel.getPrice());
        viewHolder.mt3.setText("1H : "+dataModel.getPercent_change_1h());
        DateFormat df = DateFormat.getDateTimeInstance();   
        viewHolder.mt4.setText(df.format(new Date(dataModel.getLast_updated()*1000))+" ago");
        //viewHolder.mt4.setText(dataModel.getLast_updated()+" ago");          viewHolder.mimg.setImageDrawable(mContext.getResources().getDrawable(dataModel.getImage()));
        viewHolder.mimg.setOnClickListener(this);
        viewHolder.mimg.setTag(position);
        return convertView;
    }
    @Override
    public Filter getFilter() {
        Filter filter = new Filter() {
            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
               newDataset = (ArrayList<DataModel>) results.values;
               notifyDataSetChanged();
            }
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results =  new FilterResults();
                ArrayList<DataModel> FilterArrList = new ArrayList<DataModel>();

                if(dataSet==null)
                {
                    dataSet = new ArrayList<DataModel>(newDataset);
                }
                if(constraint == null || constraint.length()==0)
                {
                    results.count = dataSet.size();
                    results.values = dataSet;
                }
                else {
                        constraint = constraint.toString().toLowerCase();
                        for (int i=0; i<dataSet.size(); i++)
                        {
                            String data = dataSet.get(i).name;
                            if(data.toLowerCase().startsWith(constraint.toString()))
                            {
                                FilterArrList.add(new DataModel(dataSet.get(i).getId(),
                                        dataSet.get(i).getImage(),
                                        dataSet.get(i).getName(),
                                        dataSet.get(i).getPrice(),
                                        dataSet.get(i).getPercent_change_1h(),
                                        dataSet.get(i).getLast_updated()));
                            }
                        }
                        results.count = FilterArrList.size();
                        results.values = FilterArrList;
                }
                return  results;
            }
        };
        return filter;
    }
}

MainActivity.class 在我的活动中,我使用了此代码。

 list.setTextFilterEnabled(true);
       editText.addTextChangedListener(new TextWatcher() {
           @Override
           public void beforeTextChanged(CharSequence s, int start, int count, int after) {

           }

           @Override
           public void onTextChanged(CharSequence s, int start, int before, int count) {
               (MainActivity.this).listAdapter.getFilter().filter(s);
           }

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

任何其他过滤ListView项的方法,我已经使用了一些stackoverflow解决方案,但在我的项目中无法使用

0 个答案:

没有答案