2016-10-01 34 views
1

我的應用程序創建一個ListView,它根據我的數組中的字符串數創建列表項。不過,我希望每個Spinner項目都能選擇適當的項目。更改由CustomAdapter創建的spinners上的文本(擴展BaseAdapter)

實施例: String[] items = {"item1", "item2", "item3"}

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    String[] items = {"item1", "item2", "item3"} 

    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, items); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    ListView listView = (ListView) findViewById(R.id.requestItems_listView); 
    listView.setAdapter(new CustomAdapter(this)); 
} 

    private class CustomAdapter extends BaseAdapter { 
     LayoutInflater inflater; 

     public CustomAdapter(Context context) { 
      inflater = LayoutInflater.from(context); 
     } 

     public int getCount() { 
      // TODO Auto-generated method stub 
      return items.length; 
     } 

     public Object getItem(int position) { 
      // TODO Auto-generated method stub 
      return position; 
     } 

     public long getItemId(int position) { 
      // TODO Auto-generated method stub 
      return position; 
     } 

     public View getView(int arg0, View convertview, ViewGroup arg2) { 
      ViewHolder viewHolder; 
      if (convertview == null) { 
       convertview = inflater.inflate(R.layout.request_item_list_item, null); 
       viewHolder = new ViewHolder(); 
       viewHolder.spinner = (Spinner) convertview.findViewById(R.id.itemSpinner); 
       viewHolder.spinner.setAdapter(adapter); 
       convertview.setTag(viewHolder); 
      } else { 
       viewHolder = (ViewHolder) convertview.getTag(); 
      } 
      return convertview; 
     } 

     public class ViewHolder { 
      Spinner spinner; 
     } 
    } 
} 

所以這應該創建3(因爲有在String [] 「項目」 3項)ListView的範圍內 「request_item_list_item」 的項目。

而且它有在位置0,從而每一個旋轉器(request_item_list_item的1份):

「ITEM1」

「ITEM1」

「ITEM1」

我將它想請執行以下操作:

「item1」

「ITEM2」

「項目3」

這會不會在CustomAdapter實現的呢?

BONUS問題: 如果我希望用戶能夠按下「添加按鈕」將列表項的數量增加1(這樣就會有4個request_item_list_items,5,6等)我應該使用的.add方法?或者我只是更改getCount並刷新列表(這不會很理想......如果用戶已經填寫了request_item_list_items中的信息,那麼它將在刷新時丟失所有輸入)?

+0

試加,viewHolder.spinner.setSelection(爲arg0 )之前,「返回convertview」。 –

+0

使您的自定義適配器和活動像這樣可能會有所幫助http://abhiandroid.com/ui/custom-spinner-examples.html –

回答

1

對於你只需要改變getView這樣的第一個問題:(如I_A_Mok評論)

public View getView(int arg0, View convertview, ViewGroup arg2) { 
    ViewHolder viewHolder; 
    if (convertview == null) { 
     convertview = inflater.inflate(R.layout.request_item_list_item, null); 
     viewHolder = new ViewHolder(); 
     viewHolder.spinner = (Spinner) convertview.findViewById(R.id.itemSpinner); 
     viewHolder.spinner.setAdapter(adapter); 
     convertview.setTag(viewHolder); 
     viewHolder.spinner.setSelection(arg0); 
    } else { 
     viewHolder = (ViewHolder) convertview.getTag(); 
    } 
    return convertview; 
} 

和第二個問題:

CustomAdapter myAdapter; 
ArrayList<String> items; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    items = new ArrayList<>(); 
    items.add("item1"); 
    items.add("item2"); 
    items.add("item3"); 

    ListView listView = (ListView) findViewById(R.id.requestItems_listView); 
    myAdapter = new CustomAdapter(this, items); 
    listView.setAdapter(myAdapter); 

    Button bt_add_new = (Button)findViewById(R.id.bt_add_new); 
    bt_add_new.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      items.add("item" + items.size() + 1); 
      myAdapter.setItems(items); 
      myAdapter.notifyDataSetChanged(); 
     } 
    }); 
} 

private class CustomAdapter extends BaseAdapter { 
    LayoutInflater inflater; 

    private ArrayList<String> items; 

    public CustomAdapter(Context context, ArrayList<String> items) { 
     inflater = LayoutInflater.from(context); 
     this.items = items; 
    } 

    public int getCount() { 
     // TODO Auto-generated method stub 
     return items.size(); 
    } 

    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    public View getView(int arg0, View convertview, ViewGroup arg2) { 
     ViewHolder viewHolder; 

     convertview = inflater.inflate(R.layout.request_item_list_item, null); 
     viewHolder = new ViewHolder(); 
     viewHolder.spinner = (Spinner) convertview.findViewById(R.id.itemSpinner); 

     ArrayAdapter<String> adapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_spinner_item, items); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     viewHolder.spinner.setAdapter(adapter); 
     convertview.setTag(viewHolder); 

     return convertview; 
    } 

    public ArrayList<String> getItems() { 
     return items; 
    } 

    public void setItems(ArrayList<String> items) { 
     this.items = items; 
    } 

    public class ViewHolder { 
     Spinner spinner; 
    } 
}