java - 过滤列表

标签 java android

我有一个国家/地区列表,我将其用作搜索,因此,如果我正在搜索特定国家/地区,一旦找到我想要的国家/地区,我就会从过滤列表中选择它。问题是,当我选择过滤列表中的第 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/

相关文章:

android - Eclipse Android 项目中的 JavaDoc

android - 从安卓平板电脑访问 USB Pendrive

java - 基本计算器错误

java - 打开文件读取Numbers并将其添加到链接列表中

android - 我的目标选择 AI 是否高效?

android - 全屏半透明自定义对话框,忽略触摸并将它们分派(dispatch)到底层 View

java - 尚未为当前线程设置 GLCapability 实例

java - Spring Integration,更改 udp-outbound-channel 端口

java - HTML5 历史记录服务器端支持的 URL 重写

android - 如何在 Android 的 SQLite 数据库中存储时间值?