标记系统使用自动填充功能的问题android

时间:2015-06-20 08:12:27

标签: java android autocomplete

我正在尝试实现类似于facebook的搜索系统,如果用户开始输入名称,它会根据输入的字母带来自动填充建议,并附加选项以搜索更多结果。每个结果都是一个对象,而不是一个字符串,我尝试为搜索添加一个额外的结果,但每次我点击搜索或其中一个对象时,对象发生替换文本与名称相反,我知道它是一个自动完成小部件的方法。还有另一种方法吗?

这是我的代码:

private AutoCompleteTextView sx;

sx = (AutoCompleteTextView) findViewById(R.id.sx);
if(sadapter == null) {
    sadapter = new Sadapter(PostActivity.this, usersFound);
    sx.setAdapter(sadapter);
}

sx.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        if (sx.getText().toString().length() <= 3 && sadapter != null) {
            usersFound.clear();
            sadapter.notifyDataSetChanged();
        }
        if (sx.getText().toString().length() > 3) {
            usersFound.clear();
            sadapter.notifyDataSetChanged();
            Log.d(Constants.DEBUG, "Changing text " + s);
                sxname = s.toString();

            testCreate();
            sadapter.notifyDataSetChanged();
        }
    }

    @Override
    public void afterTextChanged(Editable s) {
    }
});

sx.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        DatabaseUser newAdd = usersFound.get(position);
        if(position ==  searchServerIndex) {
            sx.setText(sxname);
            usersFound.clear();
            sadapter.notifyDataSetChanged();
            apiGetPossibleCandidates();
        } else {
            sx.setText("");
        }
    }
});

private void testCreate() {
    DatabaseUser nuser1 = new DatabaseUser("userid", "pictureid", "Jon");
    DatabaseUser nuser2 = new DatabaseUser("userid", "pictureid", "Jonny");
    DatabaseUser nuser3 = new DatabaseUser("userid", "pictureid", "Jong");
    DatabaseUser nuser4 = new DatabaseUser("userid", "pictureid", "Joan");
    DatabaseUser searchServer = new DatabaseUser("SearchId", "pictureid", "Search " + sxname);

    usersFound.add(nuser1);
    usersFound.add(nuser2);
    usersFound.add(nuser3);
    usersFound.add(nuser4);
    searchServerIndex = usersFound.size();
    usersFound.add(searchServer);

    if(sadapter != null) {
        sadapter.notifyDataSetChanged();
    }
}

这是适配器:

public class Sadapter extends ArrayAdapter<DatabaseUser> {

private Context mContext;
    private List<DatabaseUser> usersSearch;
    private List<DatabaseUser> usersFiltered;

    public Sadapter(Context context, List<DatabaseUser> usersAdded) {
        super(context, 0, usersAdded);
        mContext = context;
        usersSearch = usersAdded;
    }

    @Override
    public int getCount() {
        return usersSearch.size();
    }
    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater inflater = (LayoutInflater) mContext
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            v = inflater.inflate(R.layout.user_autosearch_item, null);
        }

        //helps for recycling
        final ViewHolder holder = new ViewHolder();

        holder.userTxt = (TextView) v.findViewById(R.id.userTxt);

        v.setTag(holder);

            String name = usersSearch.get(position).getName();
            holder.userTxt.setText(name);


        return v;
    }

    static class ViewHolder {
        TextView userTxt;
    }
}

1 个答案:

答案 0 :(得分:0)

你可以覆盖你的适配器中的getItem()方法,并从搜索列表中返回特定位置的DataBaseUser对象..比如

@Override public DatabaseUser getItem(int position) { 
    return usersSearch.get(position); 
}

因此,从onClick方法中,您可以调用此方法,它将为您提供DatabaseUser对象,您可以从中检索文本。我希望它可以帮助你..