【问题标题】:AutoCompleteTextView with MySQL Data带有 MySQL 数据的 AutoCompleteTextView
【发布时间】:2013-04-19 15:29:54
【问题描述】:

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

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

我将不得不发送输入为param 的短语的每个部分,用于task。我在哪里可以得到这个文本string

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

【问题讨论】:

    标签: android mysql android-asynctask autocompletetextview


    【解决方案1】:

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

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

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

    伪代码:

    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 组件,而无需通过构造函数传递它们。

    【讨论】:

    • 谢谢,我想我知道你在说什么,我只需要执行它。遇到一个早期的问题,我认为很基本​​。您能在问题末尾看到更新的代码吗?
    • @KickingLettuce 您将在 AsyncTask 方法中设置适配器。现在将您的 insertString 传递给 AsyncTask e.q。执行(插入字符串)并执行获取并在 onPostExecute 中为您的自动完成文本视图设置适配器。你也可以有空的适配器,但我建议你创建自己的适配器子类来更好地控制它。
    • 谢谢,我确实理解与 AsynTask 相关的部分。只是我的初始设置。不明白为什么是空指针。我是否错过了在调用 AsynTask 之前需要设置的其他内容?
    • @KickingLettuce 请添加您的 logcat。
    • 我继续并标记你正确;因为您回答了原始问题。这个空指针是附带的。根本想不通。但并没有真正的关系。将其作为单独的问题打开,因为它是一个不同的主题并保持这个干净。
    【解决方案2】:

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

    因此,如果您想重用现有逻辑,只需创建一个覆盖 performFiltering 方法的 AutoCompleteTextView 子类,并将执行过滤的代码放在那里(在您的情况下是 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
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      如何添加 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;
      }
      

      }

      【讨论】:

        猜你喜欢
        • 2012-07-05
        • 1970-01-01
        • 2016-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多