我有一个国家/地区列表,我将其用作搜索,因此,如果我正在搜索特定国家/地区,一旦找到我想要的国家/地区,我就会从过滤列表中选择它。问题是,当我选择过滤列表中的第 112 项时,如果它位于过滤列表的顶部,则结果实际上是未过滤列表中的第 1 项。
这将是一种更简单的解释方式,我已经上传了一个视频,可以在此处找到 Search Example
我的搜索适配器在这里:
public Context mContext;
public ArrayList<Countries> countryArrayList;
public ArrayList<Countries> original;
public CountryAdapter(Context context, ArrayList<Countries> countryArrayList) {
mContext = context;
this.countryArrayList = countryArrayList;
}
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
}
@Override
public int getCount() {
return countryArrayList.size();
}
@Override
public Object getItem(int position) {
return countryArrayList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
CountryHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.search_results_row_list, parent, false);
holder = new CountryHolder();
holder.countryName = (TextView) convertView.findViewById(R.id.country_text);
holder.countryFlag = (ImageView) convertView.findViewById(R.id.country_flag);
convertView.setTag(holder);
} else {
holder = (CountryHolder) convertView.getTag();
}
holder.countryName.setText(countryArrayList.get(position).getCountryName());
// holder.countryFlag.setImageResource(countryArrayList.get(position).getImgId());
return convertView;
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
final FilterResults oReturn = new FilterResults();
final ArrayList<Countries> results = new ArrayList<>();
if (original == null)
original = countryArrayList;
if (constraint != null) {
if (original != null && original.size() > 0) {
for (final Countries g : original) {
if (g.getCountryName()
.contains(constraint.toString()))
results.add(g);
}
}
oReturn.values = results;
}
return oReturn;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
countryArrayList = (ArrayList<Countries>) results.values;
notifyDataSetChanged();
}
};
}
public class CountryHolder {
TextView countryName;
ImageView countryFlag;
}
抱歉,我忘记了实际选择国家/地区的位置
private void setSearchResultsList() {
final CountryAdapter countryAdapter = new CountryAdapter(getActivity(), controller.getCountriesArrayList());
countryAdapter.getFilter().filter(searchPhrase);
countryAdapter.notifyDataSetChanged();
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String selectedCountry = controller.getCountriesArrayList().get(+position).getCountryName();
mISearch.searchResult(selectedCountry);
}
});
listView.setAdapter(countryAdapter);
}
谢谢
最佳答案
一次就永远:
如果您使用AdapterView.setOnItemClickListener
,获取被点击项目的正确方法是这样的实现:
adapterView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Object item = parent.getItemAtPosition(position);
}
});
parent.getItemAtPosition(position)
返回Adapter.getItem(position)
来自AdapterView
中使用的适配器(与 setAdapter
)
例如:
如果您使用
ArrayAdapter<T>
你应该投parent.getItemAtPosition(position)
至T
并使用它...对于
ArrayAdapter<POJO>
使用:POJO item = (POJO)parent.getItemAtPosition(position);
如果您使用
CursorAdapter
-
Cursor c = (Cursor)parent.getItemAtPosition(position);
-
如果您使用
SimpleAdapter
-
Map<String, ?> item = ( Map<String, ?>)parent.getItemAtPosition(position);
-
当然这取决于您的适配器实现...所以您应该记住适配器应该返回正确的对象 getItem(position)
正如文档中所述,它适用于:ListView
, GridView
, Spinner
, Gallery
以及 AdapterView
的其他子类
所以在你的情况下,正确的方法显然是:
Countries country = (Countries)parent.getItemAtPosition(position);
关于java - 过滤列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33256083/