1

我有一个AutoCompleteTextView我需要从MySQL表中建议名称。我以前只用过一次硬编码一个string array.

我在这个链接上只看到了一个例子,它真的没有多大帮助。我需要用AsyncTask. 我知道如何处理这AsynTask部分,但这是我的问题:

我将不得不发送键入为 a 的短语的每个param部分task。我从哪里得到这个文本string

我能看到的唯一方法是TextWatcher可能。是这样吗,还是有其他方法?

4

3 回答 3

1

是这样吗,还是有其他方法?

你只需要一些机制来“观察”你的输入框中的变化,并且提到了如何实现它的最正确方法TextWatcher

因此,实现它并在某些提供TextWatcher例如onTextChanged()的方法中,从输入框分配数据并将它们作为参数发送给AsyncTask并在onPostExecute()方法中为您创建新的适配器,AutoCompleteTextView并从中检索数据MySQL并将适配器分配给您的小部件,然后您就得到了它。

伪代码:

public void onTextChanged(CharSequence s, int start, int before, int count) {
   if (s.length() > 1) {
      insertString = s.toString();
      new YourTask().execute(insertString);                  
   }
}

并在您的 AsyncTask 中,执行如下操作:

protected List<String> doInBackground() {
   // fetchning data from MySQL
   return list;
}

public void onPostExecute(List<String> result) {
   if (!result.isEmpty()) {
       SomeAdapter adp = new SomeAdapter(context, layout, result);
       actv.setAdapter(adp);
   }
}

注意:在您的情况下,使您的AsyncTask类的内部类更容易,Activity并且您可以直接访问UI组件而无需通过构造函数传递它们。

于 2013-04-19T15:42:05.200 回答
1

AutoCompleteTextView已经为您处理了。基本上,默认情况下,当它确定需要过滤列表时,它会调用该performFiltering方法。

因此,如果您想重用现有逻辑,只需创建一个AutoCompleteTextView覆盖该performFiltering方法的子类并将执行过滤的代码放在那里(在您的情况下为 AsyncTask 调用)。像这样的东西:

import android.content.Context;
import android.util.AttributeSet;
import android.widget.AutoCompleteTextView;

public class MyAutoCompleteTextView extends AutoCompleteTextView {

    public MyAutoCompleteTextView(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void performFiltering(CharSequence text, int keyCode) {
        //Here the AutompleteTextView has determined that the list should be filtered
    }

}
于 2013-04-19T15:50:58.230 回答
0

如何添加 AsynTask 波纹管代码

公共类 MainActivity 扩展 Activity {

AutoCompleteTextView txtSearch;
PeopleAdapter adapter;
List<People> mList;
TextView idd;
ImageView imgspn;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mList = retrievePeople();

    txtSearch = (AutoCompleteTextView) findViewById(R.id.txt_search);

    adapter = new PeopleAdapter(this, R.layout.activity_main, R.id.lbl_name, mList);
    txtSearch.setThreshold(1);
    txtSearch.setAdapter(adapter);

    idd = (TextView) findViewById(R.id.idd);
    imgspn = (ImageView) findViewById(R.id.imgspn);
    imgspn.setVisibility(View.INVISIBLE);

    txtSearch.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String Name = mList.get(position).getId();
            idd.setText(Name);
        }
    });

}

private List<People> retrievePeople() {

    List<People> list = new ArrayList<People>();
    try {
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://192.168.0.1:3306/stud", "root",
                "Windouspass");
        Statement st = (Statement) con.createStatement();
        ResultSet rs = (ResultSet) st.executeQuery(
                "select name,designation_name,id from umdlv_users ut,t_designation td where ut.designation_id = td.designation_id");
        while (rs.next()) {

            list.add(new People(rs.getString(1), rs.getString(2), rs.getString(3)));
        }
        rs.close();
        st.close();
        con.close();
    } catch (Exception e) {
    }
    return list;
}

}

于 2016-05-12T17:47:49.460 回答