Android 在异步任务期间使用适配器集对 ListView 进行过滤和排序

标签 android listview search asynchronous filter

我正在制作一个 ListView,其中包含从服务器中的数据库中获取的数据。 ListView 的每一行都有两个 TextView,一个用于城市,另一个用于每个城市在数据库中的 ID,但是这个 textview(ID 的一个)在 ListView 中是隐藏的,因此用户只能看到城市。

一切正常,但现在我想在 ListView 中添加一个搜索栏以便过滤城市,但我遇到了以下问题:

1.-ListView 的适配器是一个简单的适配器,如您在代码中所见,我没有找到如何使用此类适配器过滤 Listview 的示例。

2.-我正在通过异步任务获取 ListView 的信息,并在异步任务的 onPostExecute 方法中设置 ListView,同样,我没有找到任何示例当它在这样的地方时过滤它。

这是“相关”代码。如果有人需要完整的代码,请向我要。

public class SQLWebVer extends ListActivity implements OnItemClickListener{
ProgressDialog barraProgreso;
    ArrayList<HashMap<String, String>> listaCiudades;
    .
    .//some more varibles for the class
    .
    protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.sqlwebver);

    // Hashmap de la ListView
    listaCiudades = new ArrayList<HashMap<String, String>>();

    new cargaCiudades().execute();//this is the call to the async task

    }
    class cargaCiudades extends AsyncTask<String, String, String>{//the async task
    .
    .//here are the onPreExecute and doInBackground methods
    .
         protected void onPostExecute(String file_url) {
        barraProgreso.dismiss();//quita la barra de la pantalla
        runOnUiThread(new Runnable(){//actualiza la UI(la listView)

            public void run() {
                // TODO Auto-generated method stub
                ListAdapter adapter = new SimpleAdapter 
                                      (SQLWebVer.this, listaCiudades, 
                                      R.layout.sqlweblist_item,
                          new String[]{"key_id", "key_ciudad"},new int[]
                                      {R.id.ID_CIUDAD, R.id.CIUDAD});

                setListAdapter(adapter);
            }

        });
        }
     }

我尝试在 onCreate 和 onPostExecute 方法上添加过滤器功能,但没有成功,有什么建议吗?

PD:奖金问题,我如何按城市字母顺序对我的 ListView 进行排序,但保持每个 ID 与他的城市相关?(不更改 php 文件)

编辑:我通过创建一个实现可过滤的自定义基础适配器解决了这个问题。没有我一开始想的那么难 ;)

最佳答案

前段时间我解决了这个问题,但我忘记发布对我有用的答案,所以这里是:

package android.codigo;

import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.ImageView;
import android.widget.TextView;


public class MiAdaptador extends ArrayAdapter<Item2> {

    private ArrayList<Item2> allItems;
    @SuppressWarnings("unused")
    private ArrayList<Item2> subItems;

    public ArrayList<Item2> getItems() {
        return allItems;
    }

    public MiAdaptador(Context context, int textViewResourceId,
            ArrayList<Item2> items) {
        super(context, textViewResourceId, items);
        this.allItems = items;
        this.subItems = items;
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater) getContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.item2_lista, null);
        }

        Item2 it = subItems.get(position);

        if (it != null) {
            TextView nombre = (TextView) v.findViewById(R.id.textView1);
            ImageView img = (ImageView) v.findViewById(R.id.imageView1);
            ImageView img2 = (ImageView) v.findViewById(R.id.imageView2);
            ImageView img3 = (ImageView) v.findViewById(R.id.imageView3);
            if (nombre != null) {
                nombre.setText(it.getNombre());
            }
            if (img != null) {
                img.setImageResource(it.getID());
            }
            if (img != null) {
                img2.setImageResource(it.getID2());
            }
            if (img != null) {
                img3.setImageResource(it.getID3());
            }
        }

        return v;

    }
    public Filter getFilter() {
        Filter filter = new Filter() {

            @Override
            protected FilterResults performFiltering(CharSequence prefijo) {

                FilterResults results = new FilterResults();
                ArrayList<Item2> aux = new ArrayList<Item2>();

                // El prefijo tiene que ser mayor que 0 y existir
                if (prefijo != null && prefijo.toString().length() > 0) {

                    for (int index = 0; index < allItems.size(); index++) {
                        Item2 si = allItems.get(index);
                        String nombre = si.getNombre();

                        String nom[] = nombre.split(" ");
                        for(int i=0; i<nom.length; i++){
                            if (nom[i].toLowerCase().startsWith(prefijo.toString().toLowerCase())) {
                                aux.add(si);
                            }
                        }
                    }
                    results.values = aux;
                    results.count = aux.size();
                } else {
                    synchronized (allItems) {
                        results.values = allItems;
                        results.count = allItems.size();
                    }
                }
                return results;
            }

            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence prefijo,FilterResults results) {
                subItems = (ArrayList<Item2>) results.values;
                notifyDataSetChanged();

            }
        };
        return filter;
    }
}

并在主类中添加:

ListView lv = (ListView)findViewById(R.id.list);
    lv.setTextFilterEnabled(true);
    lv.setAdapter(adapter);
    lv.setOnItemClickListener(this);




    TextWatcher filtro = new TextWatcher(){

        public void afterTextChanged(Editable arg0) {
            // TODO Auto-generated method stub

        }

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

        }

        public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                int arg3) {
            // TODO Auto-generated method stub
            adapter.getFilter().filter(e.getText().toString());//filtra el texto metido en el edittext en tiempo real
        }

    };

    e.addTextChangedListener(filtro);
}

关于Android 在异步任务期间使用适配器集对 ListView 进行过滤和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11387038/

相关文章:

java - 行中的 ImageView 背景

php - 搜索时的输入验证(空输入时显示 "no search result")

Android onCreate onResume

c# - Windows UI 中的 ListView 缓存?

android - 找不到 Facebook SDK.apk

java - 使用 simpleAdapter ANDROID 在 ListView 中显示图像

eclipse - 简单的eclipse搜索问题

正则表达式 Word 宏在彼此的范围内找到两个单词,然后将这些单词斜体化?

android - 如何通过 Android Studio/react native 中的 DependencyResolution 手动设置相同的版本(编译和运行时类路径)

android - 在不使用支持库的情况下使用选项卡进行 Activity ?