Не принимая во внимание, хороший ли это дизайн пользовательского интерфейса, вот как вы это сделаете:
public class TestList
{
public void blah()
{
ArrayAdapter<DataBucket> listAdapter = new ArrayAdapter<DataBucket>()
{
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
if (convertView == null)
{
convertView = LayoutInflater.from(getContext()).inflate(R.layout.testlayout, null);
}
final DataBucket dataBucket = getItem(position);
final EditText editText = (EditText) convertView.findViewById(R.id.theText);
editText.setText(dataBucket.getSomeData());
editText.addTextChangedListener(new TextWatcher()
{
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2)
{
}
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2)
{
}
public void afterTextChanged(Editable editable)
{
dataBucket.setSomeData(editable.toString());
}
});
return convertView;
}
};
}
public static class DataBucket
{
private String someData;
public String getSomeData()
{
return someData;
}
public void setSomeData(String someData)
{
this.someData = someData;
}
}
}
'DataBucket' является заполнителем. Вы должны использовать любой класс, который вы создали, для хранения данных, которые вводятся и редактируются в тексте редактирования. TextWatcher будет иметь ссылку на объект данных, на который ссылаются. При прокрутке текстовые поля для редактирования должны обновляться с текущими данными, а изменения текста должны сохраняться. Вы можете хотеть отследить, какие объекты были изменены пользователем, чтобы сделать обновления данных / сети более эффективными.
* Редактировать *
Чтобы использовать позицию int вместо прямой ссылки на объект:
ArrayAdapter<DataBucket> listAdapter = new ArrayAdapter<DataBucket>()
{
@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
if (convertView == null)
{
convertView = LayoutInflater.from(getContext()).inflate(R.layout.testlayout, null);
}
final DataBucket dataBucket = getItem(position);
final EditText editText = (EditText) convertView.findViewById(R.id.theText);
editText.setText(dataBucket.getSomeData());
editText.addTextChangedListener(new TextWatcher()
{
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2)
{
}
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2)
{
}
public void afterTextChanged(Editable editable)
{
getItem(position).setSomeData(editable.toString());
}
});
return convertView;
}
};
* Изменить еще раз *
Я чувствую себя обязанным сказать для потомков, я бы на самом деле не кодировал это так. Я предполагаю, что вам нужны немного более структурированные данные, чем массив String, и вы поддерживаете массив String снаружи, а также ArrayAdapter, так что это своего рода странная параллельная ситуация. Тем не менее, это будет работать нормально.
У меня есть данные в одном массиве String, а не в многомерном массиве. Причина в том, что модель данных, поддерживающая GridView, представляет собой простой список. Это может быть нелогичным, но так оно и есть. GridView должен выполнять разметку самостоятельно, и если его оставить для своих собственных устройств, он заполнит строку переменным числом ячеек, в зависимости от того, сколько у вас данных и насколько широкий экран (AFAIK).
Достаточно чата. Код:
public class TestList extends Activity
{
private String[] guess;
//Other methods in here, onCreate, etc
//Call me from somewhere else. Probably onCreate.
public void initList()
{
ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, /*some resourse id*/, guess)
{
@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
if (convertView == null)
{
convertView = LayoutInflater.from(getContext()).inflate(R.layout.testlayout, null);
}
final String theData = getItem(position);
final EditText editText = (EditText) convertView.findViewById(R.id.theText);
editText.setText(theData);
editText.addTextChangedListener(
new MyTextWatcher(position)
);
return convertView;
}
};
gridView.setAdapter(listAdapter);
}
class MyTextWatcher extends TextWatcher {
private int position;
public MyTextWatcher(int position) {
this.position = position;
}
public void afterTextChanged(Editable s) {
guess[position] = s.toString();
}
// other methods are created, but empty
}
}