Android 具有MySQL数据的AutoCompleteTextView
我有一个Android 具有MySQL数据的AutoCompleteTextView,android,mysql,android-asynctask,autocompletetextview,Android,Mysql,Android Asynctask,Autocompletetextview,我有一个AutoCompleteTextView,我需要从MySQL表中建议名称。我以前只在硬编码字符串数组时使用过一次 我在link上只看到了一个例子,它实际上没有多大帮助。我需要使用异步任务执行此操作。我知道如何处理AsynTask部分,但以下是我的问题: 对于任务,我必须将短语的每一部分都作为参数发送。我从哪里可以获得此文本字符串 我能看到的唯一方法是TextWatcher也许。是这样,还是有其他方法 是这样,还是有其他方法 您只需要一些机制来“监视”输入框中的更改,最正确的实现方法是Te
AutoCompleteTextView
,我需要从MySQL
表中建议名称。我以前只在硬编码字符串数组时使用过一次
我在link上只看到了一个例子,它实际上没有多大帮助。我需要使用异步任务
执行此操作。我知道如何处理AsynTask
部分,但以下是我的问题:
对于任务
,我必须将短语的每一部分都作为参数
发送。我从哪里可以获得此文本字符串
我能看到的唯一方法是TextWatcher
也许。是这样,还是有其他方法
是这样,还是有其他方法
您只需要一些机制来“监视”输入框中的更改,最正确的实现方法是TextWatcher
因此,实现它,并在一些提供TextWatcher
的方法中,例如,从inputbox分配数据,并将它们作为参数发送到AsyncTask,然后在onPostExecute()方法中,使用从MySQL
检索的数据为您的AutoCompleteTextView
创建新适配器,并将适配器分配给您的小部件,您就得到了它
伪代码:
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.length() > 1) {
insertString = s.toString();
new YourTask().execute(insertString);
}
}
在异步任务中,执行如下操作:
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);
}
}
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
}
}
受保护列表doInBackground(){
//从MySQL获取数据
退货清单;
}
public void onPostExecute(列表结果){
如果(!result.isEmpty()){
SomeAdapter adp=新的SomeAdapter(上下文、布局、结果);
实际设置适配器(adp);
}
}
注意:在您的情况下,将异步任务
作为活动
类的内部类更容易,您可以直接访问UI
组件,而无需通过构造函数传递它们。AutoCompleteTextView
已经为您解决了这一问题。
基本上,默认情况下,当它确定需要过滤列表时,它调用performFiltering
方法
因此,如果要重用现有逻辑,只需创建一个子类AutoCompleteTextView
,该子类覆盖了performFiltering
方法,并将用于执行过滤的代码放在那里(在您的例子中是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);
}
}
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
}
}
如何添加AsynTask Bellow代码
公共类MainActivity扩展了活动{
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;
}
AutoCompleteTextView-txtSearch;
适配器;
列表列表;
文本视图idd;
ImageView imgspn;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mList=retrievePeople();
txtSearch=(AutoCompleteTextView)findviewbyd(R.id.txt\u search);
适配器=新的PeoConceAPTER(this,R.layout.activity_main,R.id.lbl_name,mList);
txtSearch.setThreshold(1);
setAdapter(适配器);
idd=(TextView)findViewById(R.id.idd);
imgspn=(ImageView)findViewById(R.id.imgspn);
imgspn.setVisibility(视图不可见);
setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
String Name=mList.get(position.getId();
idd.setText(名称);
}
});
}
私人列表检索人(){
列表=新的ArrayList();
试一试{
Class.forName(“com.mysql.jdbc.Driver”);
Connection con=(Connection)DriverManager.getConnection(“jdbc:mysql://192.168.0.1:3306/stud“,”根“,
“风之路”);
语句st=(语句)con.createStatement();
结果集rs=(结果集)st.executeQuery(
“从umdlv_用户ut、t_标识td中选择名称、标识_名称、id,其中ut.designation_id=td.designation_id”);
while(rs.next()){
添加(新人员(rs.getString(1)、rs.getString(2)、rs.getString(3));
}
rs.close();
圣克洛斯();
con.close();
}捕获(例外e){
}
退货清单;
}
}谢谢,我想我知道你在说什么,我只需要执行它。遇到了一个早期的问题,我觉得很基本。你们能在问题的末尾看到更新的代码吗?@kicking莴苣你们将在AsyncTask方法中设置适配器。现在将insertString传递给AsyncTask e.q.execute(insertString),并在autocompletetextview的onPostExecute设置适配器中执行抓取和设置。您也可以有空的适配器,但我建议您创建自己的适配器子类,以获得对它的更多控制。谢谢,我确实理解与AsynTask有关的部分。只是我的初始设置。无法理解为什么为空指针。在调用AsynTask
之前,我是否遗漏了需要设置的其他内容?@kicking莴苣请添加您的日志。我继续,并将您标记为正确;既然你回答了原来的问题。这个空指针是一个次要的东西。一点也不明白。但并不是真的相关。因为这是一个不同的主题,所以我们将把它作为单独的问题来展开,并保持这个主题的整洁。