2011-12-15 59 views
0

我嘗試創建一個AutoCompleteTextView與自定義列表項目,如顯示一個圖片和名稱在一個列表項。我知道如何用列表項中的1行文本創建它,但我有點困惑誰來做更多的意見。我是關於ListAdapter的東西,並將值分配給正確的視圖。我很困難。我希望有人能給我一個正確的方向。 問題更新如下。Android AutoCompleteTextView自定義列表項包含多個視圖

主要活動:

public class AutocompleteCustomActivity extends Activity { 

String[] firstView = {"Apple","Banana","Strawberry"}; 
String[] secondView = {"Green","Yellow","Red"}; 

AutoCompleteTextView autocomplete; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    /* 
    // Simple 1 line list item 
    this.autocomplete = (AutoCompleteTextView) findViewById(R.id.autocomplete); 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, firstView); 
    autocomplete.setAdapter(adapter); 
    */ 

    // 2 Lines of text in list item 
    this.autocomplete = (AutoCompleteTextView) findViewById(R.id.autocomplete); 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.two_list_items, firstView); 
    autocomplete.setAdapter(adapter); 

} 
} 

XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="TextView" /> 

<TextView 
    android:id="@+id/textView2" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="TextView" /> 

</LinearLayout> 

UPDATE:

很多鐵桿的谷歌搜索和試示數的我想出了這個代碼後。我認爲它很好,但是選擇一個後,列表項會繼續顯示。我知道這是打開新列表項的settext。

我發現這個職位:Disable Android AutoCompleteTextView after user selects item from drop down

但我不知道他是什麼意思:(任何人都知道如何解決這個問題

package com.sb.autocompletecustom; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.AutoCompleteTextView; 
import android.widget.SimpleAdapter; 

public class AutocompleteCustomActivity extends Activity { 

AutoCompleteTextView autocomplete; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // Data to fill autocomplete 
    List<Map<String, String>> list = new ArrayList<Map<String, String>>(); 

    Map<String, String> curGroupMap = new HashMap<String, String>(); 
    list.add(curGroupMap); 
    curGroupMap.put("name", "Banana"); 
    curGroupMap.put("color", "Yellow"); 

    curGroupMap = new HashMap<String, String>(); 
    list.add(curGroupMap); 
    curGroupMap.put("name", "Strawberry"); 
    curGroupMap.put("color", "Red"); 

    curGroupMap = new HashMap<String, String>(); 
    list.add(curGroupMap); 
    curGroupMap.put("name", "Strawberry"); 
    curGroupMap.put("color", "Black"); 


    // 2 Lines of text in list item 
    this.autocomplete = (AutoCompleteTextView) findViewById(R.id.autocomplete); 

    SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.two_list_items, new String[] { "name", "color" }, new int[] { R.id.textView1, R.id.textView2 }); 
    autocomplete.setAdapter(adapter); 

    autocomplete.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> p, View v, int pos, long id) { 
      Map<String, String> map = (Map<String, String>) p.getItemAtPosition(pos); 
      String itemName = map.get("name"); 
      autocomplete.setText(itemName); 
     } 
    }); 


} 
} 
+0

你檢查這http://groups.google.com/group/ android-developers/browse_thread/thread/b0ce19d4fdd02cfb?pli = 1 – MKJParekh 2011-12-15 11:32:17

+0

這不符合我的要求(據我所知),但它是一個非常方便的代碼片段。 – 2011-12-15 15:29:33

回答

3

使用自定義列表適配器可以膨脹的佈局?並指定值

public class AutoCompleteCursorAdapter extends CursorAdapter implements Filterable{ 
    private TextView txtDrName, txtDrugName, txtDrugManufacturer; 
    private int rowResID; 
    private static Cursor c; 
    private String autoCompleteTextName; 
    Context context; 

int layout; 
public AutoCompleteCursorAdapter(Context context, int layout) { 
    super(context, c); 
    // this.c = c; 
    this.context = context; 
    this.autoCompleteTextName = autoCompleteTextName; 
    this.layout = layout; 

} 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 

    final LayoutInflater inflater = LayoutInflater.from(context); 

    View v = inflater.inflate(layout, parent, false); 


     txtDrName = (TextView)v.findViewById(R.id.txtAutoName) ; 
     .... 



} 

     return v; 



    } 
@Override 
public void bindView(View view, Context context, Cursor cursor) { 


     txtDrName = (TextView) view.findViewById(R.id.txtAutoName) ; 

} 

@Override 
public String convertToString(Cursor cursor) { 
    // this method dictates what is shown when the user clicks each entry in your autocomplete list 
    String name=""; 

     name = cursor.getString(cursor.getColumnIndex("prefix"))+" "+cursor.getString(cursor.getColumnIndex("firstName")); 


    } 


    return name; 
} 

@Override 
public Cursor runQueryOnBackgroundThread(CharSequence constraint) { 
    // this is how you query for suggestions 
    if (getFilterQueryProvider() != null) 
    { return getFilterQueryProvider().runQuery(constraint); } 
    if(constraint!=null){ 

     DataBaseHelper db = new DataBaseHelper(context); 
     db.openDataBase(); 
     if(autoCompleteTextName.equals(AppConstants.AUTOCOMPLETEDOCTORNAME)){ 
      c = db.getStaffStartingWith((String) constraint); 

     } 
     else if (autoCompleteTextName.equals(AppConstants.AUTOCOMPLETEDRUGNAME)){ 
      c = db.getDrugsForStartingWith((String) constraint); 
     } 

     c.moveToFirst(); 
     db.close(); 
    } 
    return c; 
} 

`