使用MySQL数据的AutoCompleteTextView

时间:2013-04-19 15:29:54

标签: android mysql android-asynctask autocompletetextview

我有AutoCompleteTextView我需要在MySQL表中建议名称。我之前只用过string array

的硬编码

我在this链接上只看到过一个例子,它确实没什么帮助。我需要使用AsyncTask执行此操作。我知道如何处理AsynTask部分,但这是我的问题:

我将不得不将param的{​​{1}}的每个部分发送为task。我在哪里可以获得此文string

我能看到的唯一方法是TextWatcher。那会是它,还是有另一种方法?

3 个答案:

答案 0 :(得分:1)

  

那就是它,还是有另一种方法?

您只需要一些机制来“观察”输入框中的更改,并提及如何实现它的最正确方法TextWatcher

所以实现它并在一些为onTextChanged()提供TextWatcher的方法中,从inputbox分配数据并将它们作为参数发送到 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个组件而无需传递它们通过构造函数。

答案 1 :(得分: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
    }

}

答案 2 :(得分:0)

如何添加AsynTask Bellow代码

公共类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;
}

}