gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 18:09:42 25 4
gpt4 key购买 nike

我正在制作一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com