編集可能なフィールドを持つ異種アイテムの動的リストが必要です。少し複雑に思えますが、基本的にユーザーはアイテムを追加/削除できます。各アイテムは異なるタイプにすることができ(私は という名前の抽象クラスを持っておりAction
、それぞれのタイプがそれを拡張しています)、編集可能なフィールド(つまり、EditText)があります。
を使用しListView
(より自然な方法のように思われました)、 を拡張しArrayAdapter
、 にバインドしたアダプターを作成しましArrayList<Action>
たが、リスト項目への変更が ArrayList の対応する項目に戻されていないことに気付きました。
説明するのは難しいですが、私はこれを行います:
アプリケーションを起動し、特定のタイプの要素を追加し、 EditText に idR.id.action_add_text
で何かを書き込みます。
String text = ((EditText) actions.get(0).view.findViewById(R.id.action_add_text)).getText().toString();
私がそのEditTextに書いたものを反映していますが、空のままです。
どこが間違っていますか?保存するために現在のリストの状態を取得する必要がありますが、取得する場所がわかりません。UI の変更がアダプターに報告されるように「双方向」にバインドする方法はありますか? または、リストビューの子を反復処理する必要がありますか (ただし、アダプターの機能は何ですか)?
しばらくお待ちください。たくさん検索しましたが、役立つ情報が見つかりませんでした (検索する適切な単語が見つからない可能性があります)。
編集: ArrayAdapter 実装 import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
public class ActionAdapter extends ArrayAdapter<Action> {
Context context;
int layoutResourceId;
ArrayList<Action> actions = null;
public ActionAdapter(Context context, int layoutResourceId, ArrayList<Action> actions) {
super(context, layoutResourceId, actions);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.actions = actions;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ActionHolder holder = null;
if(row == null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(actions.get(position).viewId, parent, false);
holder = new ActionHolder();
holder.title = (TextView)row.findViewById(R.id.action_title);
row.setTag(holder);
}
else
{
holder = (ActionHolder)row.getTag();
}
Action action = actions.get(position);
holder.title.setText(action.title);
return row;
}
static class ActionHolder
{
TextView title;
}
}
その間、getItemViewType と getViewTypeCount をオーバーライドする必要があると思いますよね?