2016-10-01 2 views
1

Мое приложение создает ListView, который создает элементы списка в зависимости от количества строк в моем массиве. Тем не менее, я бы хотел, чтобы каждый элемент Spinner имел соответствующий элемент.Измените текст на прядильщиках, созданных CustomAdapter (расширяет базовый адаптер)

Пример: 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 (потому что есть 3 пункта в строке [] "элементы") "request_item_list_item" элементов внутри ListView.

И это имеет каждый кок (1 часть request_item_list_item) в положение 0, так:

"item1"

"item1"

"item1"

Я хотел бы его однако следует отметить следующее:

"item1"

"item2"

"item3"

ли это осуществить в CustomAdapter?

BONUS Вопрос: Если бы я хотел, чтобы пользователь мог нажать кнопку «Добавить», чтобы увеличить количество элементов списка на 1 (так что было бы 4 request_item_list_items, 5, 6 и т. Д.) Есть метод .add, который я должен использовать? или я просто изменяю getCount и обновляю список (это было бы не идеально ... если пользователь уже заполнил информацию в request_item_list_items, они потеряли бы все свои входы, когда он обновится)?

+0

Постарайся добавить, viewHolder.spinner.setSelection (arg0), перед «return 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; 
    } 
} 
Смежные вопросы