2012-02-24 1 views
4

Я пытаюсь создать приложение, в котором имена сотрудников хранятся в таблице. На определенной странице пользователь может ввести имя сотрудника в поле autocompletetextview и выбрать одно из всплывающих подсказок. Основываясь на том, что было выбрано, я хочу заполнить другие поля на экране. Для этого я возвращаю 2d строковый массив из базы данных SQL Lite, содержащий имя массива, dept, desg и т. Д.. Массив имен подает в представлении Auto Complete.Android: Использование элемента, выбранного в AutoCompleteTextView, для заполнения другого поля

Теперь проблема связана с индексом, возвращаемым в методе onClickItemlistener. Возвращаемый индекс соответствует списку, который был отображен, наконец, до того, как был выбран конкретный элемент, а не от исходного массива имен, который Сдан.

Например, если у меня есть 2d массив как:

name   department    designation 
    Abc1234   Dept1     desg1 
    Def1234   D2      d2 
    Abcxyz    D3      d3 
    Defabc    D4      D5 
    Abcdef    D6      D6 

Теперь, если я типа в Abc в к AutoCompleteTextView, только 3 элементы отображаются, и если выбрать ABCDEF положение и идентификатор возвращано 2, тогда как индекс в исходном массиве равен 5. Я хочу, чтобы это 5 каким-то образом возвращалось, чтобы получить соответствующие значения дельта и деза D6.

Надеюсь, я достаточно ясен. Это моя вторая неделя программирования в андроиде. поэтому, пожалуйста, будьте осторожны. Я уже обыскал сеть достаточно, но не смог найти ответ на этот вопрос.

EDIT ::: Наконец-то я создал клиентский адаптер, но по-прежнему остается одна проблема, которая сохраняется ... Я как-то теряю значение объекта ArrayList в классе CustomAdapter при нажатии клавиши. состояние «orig.size()> 0» в цикл метода performFiltering никогда не станет успешным и автозаполнение не работает ...

Ниже, как я устанавливаю адаптер ...

 ArrayList<Part_Mstr_Info> mAllParts = partMstrDbHelper.getAll(); 
    if (mAllParts != null) { 
    /* ac_part_id = mAllParts.get_part_id(); 
     ac_name = mAllParts.get_name(); 
     ac_desg = mAllParts.get_desg(); 
     ac_org = mAllParts.get_org(); 
     ac_dept = mAllParts.get_dept();*/ 
     adapter = new CustomAdapter(this, R.layout.ac_name_list, mAllParts); 
     mName.setAdapter(adapter); 
     mName.setOnItemClickListener(new OnItemClickListener(){ 
     @Override 
      public void onItemClick(AdapterView<?> adapter, View view, int index, long id) { 

      Part_Mstr_Info part_mstr_info = (Part_Mstr_Info) adapter.getItemAtPosition(index); 
      mPartMstrID = part_mstr_info.get_part_id(); 
      name = part_mstr_info.get_name(); 
      mName.setText(name); 
      desg = part_mstr_info.get_desg(); 
      mDesg.setText(desg); 
      org = part_mstr_info.get_org(); 
      mOrg.setText(org); 
      dept = part_mstr_info.get_dept(); 
      mDept.setText(dept); 
     } 
     }); 

Ниже приведено описание моего пользовательского адаптера ....

package com.meeting.minutes; 

import java.util.ArrayList; 

import android.app.Activity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.Filter; 
import android.widget.Filterable; 
import android.widget.TextView; 

import com.meeting.minutes.PartMstrDbAdapater.Part_Mstr_Info; 

public class CustomAdapter extends ArrayAdapter<Part_Mstr_Info> implements Filterable{ 
    private ArrayList<Part_Mstr_Info> entries, orig; 
    private Activity activity; 
    private ArrayFilter myFilter; 

    public CustomAdapter(Activity a, int textViewResourceId, ArrayList<Part_Mstr_Info> entries) { 
     super(a, textViewResourceId, entries); 
     this.entries = entries; 
     orig = this.entries; 
     this.activity = a; 
    } 

    public static class ViewHolder{ 
     public TextView tv_ac_name; 
     public TextView tv_ac_desg; 
     public TextView tv_ac_org; 
     public TextView tv_ac_dept; 
    } 

    @Override 
    public int getCount(){ 
      return entries!=null ? entries.size() : 0; 
    } 

    @Override 
    public Part_Mstr_Info getItem(int index) { 
     return entries.get(index); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     ViewHolder holder; 
     if (v == null) { 
      LayoutInflater vi = 
       (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.ac_name_list, null); 
      holder = new ViewHolder(); 
      holder.tv_ac_name = (TextView) v.findViewById(R.id.ac_name); 
      holder.tv_ac_desg = (TextView) v.findViewById(R.id.ac_desg); 
      holder.tv_ac_org = (TextView) v.findViewById(R.id.ac_org); 
      holder.tv_ac_dept = (TextView) v.findViewById(R.id.ac_dept); 
      v.setTag(holder); 
     } 
     else 
      holder=(ViewHolder)v.getTag(); 

     final Part_Mstr_Info custom = entries.get(position); 
     if (custom != null) { 
      holder.tv_ac_name.setText(custom.get_name()); 
      holder.tv_ac_desg.setText(custom.get_desg()); 
      holder.tv_ac_org.setText(custom.get_org()); 
      holder.tv_ac_dept.setText(custom.get_dept()); 
     } 
     return v; 
    } 

    @Override 
    public Filter getFilter() { 
     if (myFilter == null){ 
      myFilter = new ArrayFilter(); 
     } 
     return myFilter; 
    } 


    private class ArrayFilter extends Filter { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      if (orig == null) 
       orig = entries; 
      if (constraint != null) { 
       ArrayList<Part_Mstr_Info> resultsSuggestions = new ArrayList<Part_Mstr_Info>(); 
       for (int i = 0; i < orig.size(); i++) { 
        if(orig.get(i).get_name().toLowerCase().startsWith(constraint.toString().toLowerCase())){ 
         resultsSuggestions.add(orig.get(i)); 
        } 
       } 
       FilterResults results = new FilterResults(); 
       results.values = resultsSuggestions; 
       results.count = resultsSuggestions.size(); 
       return results; 
      } 
      else { 
       return new FilterResults(); 
      } 
     } 

     @Override 
     @SuppressWarnings("unchecked") 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      clear(); 
      ArrayList<Part_Mstr_Info> newValues = (ArrayList<Part_Mstr_Info>) results.values; 
      if(newValues !=null) { 
       for (int i = 0; i < newValues.size(); i++) { 
        add(newValues.get(i)); 
       } 
       if(results.count>0) { 
        notifyDataSetChanged(); 
       } else { 
        notifyDataSetInvalidated(); 
       } 
      }  

     } 

    } 
} 

Я создал это, видя различные веб-сайты и разные сообщения, а также исходный код Array Adapter ... Не могу понять, что происходит со мной, когда несколько других людей упомянули, что для них работает тот же код .... . Любая помощь приветствуется ....

ответ

0

Вы можете создать пользовательский адаптер для своего автокомплектаTextView, который имеет всю информацию, скажем, у вас есть класс People (имя, отдел, обозначение).

Что-то вроде

autoCompleteTextView.setAdapter(new CustomAdapter<People>(getBaseContext(), android.R.layout.simple_list_item_1, "a list of all your people")) 
+0

Значит, вы хотите сказать что вместо использования Array Adapter я должен использовать этот пользовательский адаптер. У меня есть класс, определенный как Люди, о котором вы говорили здесь. Позвольте мне попробовать этот вариант и сообщить о том, что произойдет. – Sriman

+1

Кажется, что для пользовательского адаптера требуется много кода для написания. Рассматривая другие решения (хотя и не такие элегантные, как этот) ... – Sriman

+0

Я попробовал пользовательский адаптер, но есть проблема.Пожалуйста, см. Редактирование в исходном сообщении и помогите мне ... Спасибо за ваше время ... – Sriman

0

Я нашел проблему .... Это было из-за недостающего фрагмента кода в методе performFiltering ... Когда ограничение (или префикс) с помощью которого список должен быть отфильтрованным нулевым, нам просто нужно вернуть весь список обратно .... Как только это было добавлено в else для нулевой проверки ограничения, фильтрация работает как золотая ....

  ArrayList <Part_Mstr_Info> list = new ArrayList <Part_Mstr_Info>(orig); 
      results.values = list; 
      results.count = list.size(); 
+0

Как вы возвращаете другие данные, соответствующие выбранному элементу, для заполнения другого поля. Я застрял в проблеме, подобной этой, и я не получаю, о том, как вернуть другое значение массива json для заполнения другого поля. Я новичок. – carefree

+0

Вы определяете класс со всеми необходимыми данными. В моем случае Part_Mstr_Info - это класс с полями Name, Desg, Dept и Org. Вы выбираете имя из раскрывающегося списка, связанные с ним, dept и org получают и заполняются на экране. – Sriman

Смежные вопросы