Android 使用 arrayadapter 过滤 ListView

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/10532194/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 04:04:11  来源:igfitidea点击:

Filter ListView with arrayadapter

androidfilterandroid-arrayadapter

提问by user1159489

I'm trying to filter a listview with arrayadapter. The arraydapter parameter is a String[][]. The problem is that anything happens. I must override the Filter interface? In that case plase, can someone provide some hints?

我正在尝试使用 arrayadapter 过滤列表视图。arraydapter 参数是一个 String[][]。问题是任何事情都会发生。我必须覆盖过滤器接口吗?在这种情况下,有人可以提供一些提示吗?

Every position of the array I'm trying to filter is like

我试图过滤的数组的每个位置都像

 galleryValues[0][0] -> "tiulo"
              [0][1] -> "desc"
              [0][2] -> "etc"

I tryied to filter it:

我试着过滤它:

lstContinente = (ListView)findViewById(R.id.list);
lstContinente.setTextFilterEnabled(true);
adapter = new PortaitArrayAdapter(cx,galleryValues);   
lstContinente.setAdapter(adapter);

ed_busqueda.addTextChangedListener(new TextWatcher() {           
    public void afterTextChanged(Editable s) {}      
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    // TODO Auto-generated method stub       
}        
public void onTextChanged(CharSequence s, int start, int before, int count) {
    adapter.getFilter().filter(s.toString());
    adapter.notifyDataSetChanged();                 
}        
});

The adapter code:

适配器代码:

public class PortaitArrayAdapter extends ArrayAdapter<String> {
    private final Context context;
    private final String[][] values;
    private List<Imagen> imagenes = null;
    private LayoutInflater mInflater;
    public ImageLoader imageLoader;     


    public PortaitArrayAdapter(Context context, String[][] values) {
        super(context, R.layout.gallery_row);
        this.context = context;
        this.values = values;
        mInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        imagenes = new ArrayList<Imagen>();
        for (int i = 0; i < 20; i++) imagenes.add(new Imagen());
        Bitmap def = BitmapFactory.decodeResource(this.context.getResources(),R.drawable.ic_launcher);
        imageLoader=new ImageLoader(this.context,def, imagenes);
    }



    @Override
    public int getCount (){
        return this.values.length;
    }

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

        ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();

            convertView =  mInflater.inflate(R.layout.gallery_row, parent, false);
            holder.txtTitulo = (TextView) convertView.findViewById(R.id.txt_gallery_titulo);
            holder.txtDesc = (TextView) convertView.findViewById(R.id.txt_gallery_desc);
            holder.txtFecha = (TextView) convertView.findViewById(R.id.txt_gallery_fecha);
            holder.txtEst = (TextView) convertView.findViewById(R.id.txt_gallery_est);
            holder.imageView    = (ImageView)convertView.findViewById(R.id.lst_img_gallery);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }


        /*LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.gallery_row, parent, false);*/

        //ImageView imageView = (ImageView) rowView.findViewById(R.id.icon);


        Bitmap bmp;
        Log.v("Position --> ",String.valueOf(position));
        try {
            byte b[] = imagenes.get(position).getImageData();
            if (b != null) {
                bmp = BitmapFactory.decodeByteArray(b, 0, b.length);
                if (bmp != null) holder.imageView.setImageBitmap(bmp);
            } else {

                String urlBase = galleryValues[position][0].substring(0, galleryValues[position][0].lastIndexOf("/")+1);
               String urlToEncode = galleryValues[position][0].substring(galleryValues[position][0].lastIndexOf("/")+1, galleryValues[position][0].length());

               urlToEncode = URLEncoder.encode(urlToEncode,"UTF-8");

               String url = urlBase.concat(urlToEncode);

               url = url.replace("+", "%20");
               Log.v("UrlFinal --> ",url);

                imageLoader.DisplayImage(String.valueOf(position),url,act,holder.imageView, position,null);
            }

        } catch (Exception e) {
            Log.e(this.getClass().getName(),"Exception en pos = " + position + " error:" + e.getMessage());
            e.printStackTrace();
        }


        holder.txtTitulo.setText(galleryValues[position][1] + ", " + galleryValues[position][2]);

        String[] dates = galleryValues[position][4].split("/");  
        String date = dates [1] + "/" + dates[0] + "/" + dates[2];
        Date d1 = new Date(date);
        DateFormat df = DateFormat.getDateInstance(DateFormat.LONG);
        holder.txtDesc.setText(galleryValues[position][3]);

        holder.txtFecha.setText(df.format(d1));
        holder.txtEst.setText(getText(R.string.num_fotos_gallery) + galleryValues[position][5] + " - " + getText(R.string.num_videos_gallery) + galleryValues[position][6] + " - " + getText(R.string.num_exp_gallery) + galleryValues[position][7]);

        return convertView;
    }

}

private static class ViewHolder {
    TextView txtTitulo;
    TextView txtDesc;
    TextView txtFecha;
    TextView txtEst;
    ImageView imageView;
}

回答by Venky

Convert your String array to ArrayListand pass it to Adapterand use below code or change below code with your String[].

将您的字符串数组转换为ArrayList并将其传递给Adapter并使用以下代码或使用您的String[].

You need to implement Filterableto your Adapterclass and Override getFilter()

您需要实施Filterable到您的Adapter班级和Override getFilter()

Checkout thiscomplete example for filtering custom Adapter.

查看完整示例以过滤自定义Adapter.

public class ListFilterActivity extends ListActivity {

    private List<String> list = new ArrayList<String>();
    List<String> mOriginalValues;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final MyAdapter adapter = new MyAdapter(this, getModel());
        setListAdapter(adapter);

        EditText filterEditText = (EditText) findViewById(R.id.filterText);

        // Add Text Change Listener to EditText
        filterEditText.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // Call back the Adapter with current character to Filter
                adapter.getFilter().filter(s.toString());
            }

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

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

    private List<String> getModel() {
        list.add("Linux");
        list.add("Windows7");
        list.add("Suse");
        list.add("Eclipse");
        list.add("Ubuntu");
        list.add("Solaris");
        list.add("Android");
        list.add("iPhone");
        list.add("Windows XP");
        return list;
    }
}

// Adapter Class
public class MyAdapter extends BaseAdapter implements Filterable {

    List<String> arrayList;
    List<String> mOriginalValues; // Original Values
    LayoutInflater inflater;

    public MyAdapter(Context context, List<String> arrayList) {
        this.arrayList = arrayList;
        inflater = LayoutInflater.from(context);
    }

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

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

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

    private class ViewHolder {
        TextView textView;
    }

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

        ViewHolder holder = null;

        if (convertView == null) {

            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.row, null);
            holder.textView = (TextView) convertView
            .findViewById(R.id.textview);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.textView.setText(arrayList.get(position));
        return convertView;
    }

    @Override
    public Filter getFilter() {
        Filter filter = new Filter() {

            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint,FilterResults results) {

                arrayList = (List<String>) results.values; // has the filtered values
                notifyDataSetChanged();  // notifies the data with new filtered values
            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results = new FilterResults();        // Holds the results of a filtering operation in values
                List<String> FilteredArrList = new ArrayList<String>();

                if (mOriginalValues == null) {
                    mOriginalValues = new ArrayList<String>(arrayList); // saves the original data in mOriginalValues
                }

                /********
                *
                *  If constraint(CharSequence that is received) is null returns the mOriginalValues(Original) values
                *  else does the Filtering and returns FilteredArrList(Filtered)
                *
                ********/
                if (constraint == null || constraint.length() == 0) {

                    // set the Original result to return
                    results.count = mOriginalValues.size();
                    results.values = mOriginalValues;
                } else {
                    constraint = constraint.toString().toLowerCase();
                    for (int i = 0; i < mOriginalValues.size(); i++) {
                        String data = mOriginalValues.get(i);
                        if (data.toLowerCase().startsWith(constraint.toString())) {
                            FilteredArrList.add(data);
                        }
                    }
                    // set the Filtered result to return
                    results.count = FilteredArrList.size();
                    results.values = FilteredArrList;
                }
                return results;
            }
        };
        return filter;
    }
}

回答by Jatin Raghav

HereI mention the code of how We can filter the listView Data using custom Adapter
Its really help you

这里我提到了我们如何使用自定义适配器过滤 listView 数据的代码
它真的对你有帮助

ListViewAdapter.java

ListViewAdapter.java

public class ListViewAdapter extends BaseAdapter {

    // Declare Variables
    Context mContext;
    LayoutInflater inflater;
    public List<AllFoodItem> allFoodItemlist;
    public ArrayList<AllFoodItem> arraylist;

    public ListViewAdapter(Context context, List<AllFoodItem> allFoodItemlist) {
        mContext = context;
        this.allFoodItemlist = allFoodItemlist;
        inflater = LayoutInflater.from(mContext);
        this.arraylist = new ArrayList<AllFoodItem>();
        this.arraylist.addAll(allFoodItemlist);
    }
    @Override
    public int getCount() {
        return allFoodItemlist.size();
    }

    @Override
    public AllFoodItem getItem(int position) {
        return allFoodItemlist.get(position);
    }

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

    public class Holder {
        TextView foodname, quantity, calorie;    
    }    
    public View getView(final int position, View view, ViewGroup parent) {
        Holder holder = new Holder();
        view = inflater.inflate(R.layout.program_list, null);
        // Locate the TextViews in listview_item.xml
        holder.foodname = (TextView) view.findViewById(R.id.textView1);
         // Set the results into TextViews            holder.foodname.setText(allFoodItemlist.get(position).getName().toString());    
        return view;
    }

    // Filter Class
    public void filter(String charText) {
        charText = charText.toLowerCase(Locale.getDefault());
        allFoodItemlist.clear();
        if (charText.length() == 0) {
            allFoodItemlist.addAll(arraylist);
        } else {
            for (AllFoodItem wp : arraylist) {
                if (wp.getName().toLowerCase(Locale.getDefault()).contains(charText)) {
                    allFoodItemlist.add(wp);
                }
            }
        }
        notifyDataSetChanged();
    }

}

MainActivity.java

主活动.java

use the ListViewAdapter class apply filter on EditText by using filter() method

使用 ListViewAdapter 类通过 filter() 方法在 EditText 上应用过滤器

inputSearch.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                // When user changed the Text
                foodname = (inputSearch.getText().toString()).trim();

                // filter the data of edit Text using filter method in ListViewAdapter
                String text = inputSearch.getText().toString().toLowerCase(Locale.getDefault());
                adapter.filter(text);
            }

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

            }

            @Override
            public void afterTextChanged(Editable arg0) {

                userGet();
                // TODO Auto-generated method stub
            }
        });