0

我會使用AutoCompleteTextView使用來自web-service-rest的數據。難點在於在ViewHolder中使用ArrayAdapter。Android AutoCompleteTextView和ViewHolder

這是我mainActivity.java的一部分

final AutoCompleteTextView autoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1); 
     autoCompleteTextView.addTextChangedListener(new TextWatcher() { 

      private boolean shouldAutoComplete = false; 

      public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
       shouldAutoComplete = true; 

      } 

      public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
        int arg3) { 
       // TODO Auto-generated method stub 

      } 

      public void afterTextChanged(Editable arg0) { 
       if(shouldAutoComplete){ 

        try { 
         ArrayList<Intervento> interventos = getInterventos(autoCompleteTextView.getText().toString()); 
         AutoCompleteAdapter adapter = new AutoCompleteAdapter(MainActivity.this,R.layout.suggest_list,interventos); 
         adapter.setNotifyOnChange(true); 
         autoCompleteTextView.setAdapter(adapter); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (ExecutionException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 

       } 

      } 
     }); 

這是我的自定義類AutoCompleteAdapter

public class AutoCompleteAdapter extends ArrayAdapter<Intervento> implements Filterable { 

    static class ViewHolder{ 
     private TextView textName; 
     private TextView textId; 
    } 

    private ArrayList<Intervento> arrayListIntervento; 
    private int    layout; 


    @Override 
     public int getCount() { 
     return arrayListIntervento.size(); 
     } 

    @Override 
    public Intervento getItem(int index) { 
     return arrayListIntervento.get(index); 
    } 


    @Override 
     public Filter getFilter() { 
     Filter myFilter = new Filter() { 
       @Override 
       protected void publishResults(CharSequence contraint, FilterResults results) { 
        if(results != null && results.count > 0) { 
        notifyDataSetChanged(); 
        } 
        else { 
         notifyDataSetInvalidated(); 
        } 
       } 

       @Override 
       protected FilterResults performFiltering(CharSequence arg0) { 
        FilterResults filterResults = new FilterResults(); 
        if(arg0 != null) { 
         try { 
          arrayListIntervento = new InterventoController().execute("http://192.168.1.162:8080/******/******/{*******}/****/**********", arg0.toString()).get(); 
         } 
         catch(Exception e) { 
          e.printStackTrace(); 
         } 
         // Now assign the values and count to the FilterResults object 
         filterResults.values = arrayListIntervento; 
         filterResults.count = arrayListIntervento.size(); 
        } 
        return filterResults; 
       } 
      }; 
      return myFilter; 
    } 




    @Override 
    public View getView(int position, View contentView, ViewGroup viewGroup) { 

     View  view = null; 
     ViewHolder viewHolder = null; 

     if(contentView==null){ 
      LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = inflater.inflate(R.layout.suggest_list, null); 

      if (view != null) { 
       viewHolder = new ViewHolder(); 
       viewHolder.textId = (TextView) view.findViewById(R.id.idIntervento); 
       viewHolder.textName = (TextView) view.findViewById(R.id.nomeIntervento); 
       view.setTag(viewHolder); 
      } 
     }else { 
      view = contentView; 
      viewHolder = (ViewHolder) contentView.getTag(); 
     } 

     if (viewHolder != null) { 
      Intervento intervento = arrayListIntervento.get(position); 
      if(intervento!=null){ 
       viewHolder.textId.setText(intervento.getIdintervento().toString()); 
       viewHolder.textId.setVisibility(View.INVISIBLE); 
       viewHolder.textName.setText(intervento.getNome()); 
      } 
     } 

     return view; 

    } 

    public AutoCompleteAdapter(Context context, int textViewResourceId) { 
     super(context, textViewResourceId); 

     this.arrayListIntervento= new ArrayList<Intervento>(); 
     this.layout=textViewResourceId; 
    } 


} 

,這是我的建議,上市

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 

     <TextView 
      android:id="@+id/nomeIntervento" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentTop="true" 
      android:text="@string/autocompleteIntervento" /> 

     <TextView 
      android:id="@+id/idIntervento" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentTop="true" 
      android:text="@string/autocompleteIntervento" /> 


    </RelativeLayout> 

我可以自定義佈局獲取數據但我沒有顯示在屏幕上。哪裏有問題? 在此先感謝!

回答

0

嘿,你剛剛錯過了實施Filterable。使用this作爲參考。 希望這會幫助你。

+0

好的我已經實現了它,但是我無法顯示結果! –

+0

關於如何使用可過濾的,有很多很好的例子。只是谷歌它。我相信你會得到一個。 –