Как получить данные из 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()