Как получить данные из ListView в Android, когда я использую пользовательский адаптер

У меня есть одно ListView в моем приложении для Android, где я получаю некоторый цвет из базы данных и помещаю некоторое число против него (в основном, я сохраняю запас для каждого цвета), который мне нужно сохранить в базе данных. Для цветов я использую класс сущности Color (Stock) и мне нужно сохранить его в другом объекте.

Мой код адаптера

public class ColorStockListViewAdapter extends ArrayAdapter<Color> {

Context context;
int resourceId;

public ColorStockListViewAdapter(Context context, int resourceId,
        List<Color> items) {
    super(context, resourceId, items);
    this.context = context;
    this.resourceId = resourceId;
}

/* private view holder class */
private class ViewHolder {
    // ImageView vehicleImageView;
    TextView colorDesc;
    SeekBar seekBar;
    EditText countText;
}

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    Color rowItem = getItem(position);

    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = mInflater.inflate(resourceId, null);
        holder = new ViewHolder();

        holder.colorDesc = (TextView) convertView
                .findViewById(R.id.colorCode);

        holder.seekBar = (SeekBar) convertView
                .findViewById(R.id.countSeekBar);
        holder.countText = (EditText) convertView
                .findViewById(R.id.countEditText);

        holder.seekBar.setTag(holder.countText);
        holder.countText.setTag(holder.seekBar);

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.colorDesc.setText(rowItem.getDescription());
    holder.countText.setText("0");

    return convertView;
}
}

Мой макет ListView

<ListView
    android:id="@+id/colorStockList"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/vehicleOption"
    android:divider="#b5b5b5"
    android:dividerHeight="1dp" >

и внутренний макет в списке

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="5dip" >

<TextView
    android:id="@+id/colorCode"
    android:layout_height="wrap_content"
    android:layout_width="0dp"
    android:gravity="start"
    android:layout_weight="1"
    android:textAppearance="?android:attr/textAppearanceMedium" />

<SeekBar
    android:id="@+id/countSeekBar"
    android:layout_width="0dp"
    android:layout_weight="4"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:progress="0"
    android:secondaryProgress="0" />

<EditText
    android:id="@+id/countEditText"
    android:layout_height="50dp"
    android:layout_width="0dp"
    android:layout_weight="1"
    android:gravity="end"
    android:inputType="number" />

</LinearLayout>

Теперь мне нужно получить значения для всех цветов и сохранить их по нажатию кнопки.

Теперь проблема в том, что я не уверен, как получить все данные (countEditText) для каждого цвета (colorCode). Я пробовал много способов, но все еще не получил это. Я даже сослался на множество таких вопросов о stackru, но я думаю, что мои ограниченные знания Android не сильно мне здесь помогли. просто еще раз выделю, я не собираю данные по щелчку строки, а по нажатию отдельной кнопки.

РЕДАКТИРОВАТЬ Это метод, в котором я пытаюсь получить данные ListView

public void addStock(View view){

    int count = listView.getCount();

    for(int i = 0; i < count; i++){
        // I get color object here, so not sure how to get EditText view value I have in my list
        Color color = (Color) listView.getItemAtPosition(i);
    }

    for(int i = 0; i < adapter.getCount(); i++){
        // I get color object here, so not sure how to get EditText view value I have in my list
        Color color = adapter.getItem(i);
    }

    // My AsyncTask to save data.
    new StockTask().execute();
}

2 ответа

Решение

Хорошо, я наконец-то смог обойти это. Вот мой обновленный метод addStock

public void addStock(View view){

    List<Stock> stockList = new ArrayList<Stock>();
    Stock stock;

    int count = listView.getCount();

    for(int i = 0; i < count; i++){
        Color color = (Color) listView.getItemAtPosition(i);

        // Here's the critical part I was missing
        View childView = listView.getChildAt(i);
        EditText editText = (EditText) childView.findViewById(R.id.countEditText);
        String colorCount = editText.getText().toString();

        stock = new Stock();
        stock.setColorCode(color.getCode());
        stock.setCount(Integer.valueOf(colorCount));

        stockList.add(stock);
    }

    new StockTask().execute(stockList);
}

Определить поле List<Color> items, установите его в конструкторе и получите, когда вам это нужно.

public class ColorStockListViewAdapter extends ArrayAdapter<Color> {

    ...

    public ColorStockListViewAdapter(Context context, int resourceId,
            List<Color> items) {
        super(context, resourceId, items);
        this.context = context;
        this.resourceId = resourceId;
        this.items = items;
    }


    private List<Color> items

    public List<Color> getColors() {
        return items;
    }
    ...
}

а в других местах звони adapter.getColors()

Другие вопросы по тегам