Android - 使用自定义BaseAdapter搜索ListView内容

时间:2016-01-26 11:29:19

标签: android listview android-edittext baseadapter

我有一个ListView,我使用BaseAdapter插入了值。 这是我的BaseAdapter的源代码

   .header ul {
    list-style-type:none;
    margin:0;
    padding:0;
    position: static;
    margin-bottom:2px;
}

header li {
    display:inline-block;
    float: left;
    margin-right: 1px;
}

ul li
{
  display:inline-block;
  padding-right:10%;
  background-color:gray;
  padding:10px;
}
ul li:hover
{
  background-color:blue;
  color:white;
}

ul li
{display:inline-block;}a
{
  text-decoration:none;
}

在Edittext的addTextChangedListener方法中,我尝试按名称搜索值。搜索工作完美但当我点击项目时,从所选项目中选择始终首先迭代 例如,我在arraylist中有['一个',两个'三个'四个']元素,如果我搜索四个'(在listview中我只能显示'四')但是当我点击所选项目时 resutl是' one'总是我的arraylist中的第一个元素 我不知道我的代码中有什么问题

private class BankNameAdapter extends BaseAdapter {
    Context activity;
    int layoutResourceId;
    Bank bank;
    private List<Bank> data;
    private List<Bank> orig;
    UserHolder holder = null;

    public BankNameAdapter(Context context, int layoutResourceId, List<Bank> data) {

        this.layoutResourceId = layoutResourceId;
        this.activity = context;
        this.data = data;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View row = convertView;

        if (row == null) {
            LayoutInflater inflater = LayoutInflater.from(activity);
            holder = new UserHolder();
            row = inflater.inflate(layoutResourceId, parent, false);

            holder.PersonType = (TextView) row.findViewById(R.id.spinner_tittle);

            row.setTag(holder);
        } else {
            holder = (UserHolder) row.getTag();
        }
        bank = data.get(position);


        holder.PersonType.setText(bank.getBank());



        return row;

    }

    public Filter getFilter() {
        return new Filter() {

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                final FilterResults oReturn = new FilterResults();
                final ArrayList<Bank> results = new ArrayList<>();
                if (orig == null)
                    orig = data;
                if (constraint != null) {
                    if (orig != null && orig.size() > 0) {
                        for (final Bank uBanks : orig) {
                            if (uBanks.getBank().toLowerCase()
                                    .contains(constraint.toString()))
                                results.add(uBanks);
                        }
                    }
                    oReturn.values = results;
                }
                return oReturn;
            }

            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint,
                                          FilterResults results) {
                data = (ArrayList<Bank>) results.values;
                notifyDataSetChanged();
            }
        };
    }

    @Override
    public int getCount() {

        return data.size();
    }

    @Override
    public Object getItem(int position) {

        return data.get(position);
    }

    @Override
    public long getItemId(int position) {

        return 0;
    }

    class UserHolder {
        public TextView PersonType;

    }

}

这是我的代码 如果有人知道解决方案,请加上我感谢所有人

2 个答案:

答案 0 :(得分:1)

这是一个问题

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

正确答案是

 @Override
 public Bank getItem(int position) {
 return data.get(position);
    }

Bank bank = bankNameAdapter.getItem(position);

工作完美。我解决了自己

答案 1 :(得分:0)

在你的项目点击

替换你的

Bank bank = bankList.get(position);

 Bank bank = (Bank)parent.getItemAtPosition(position);