0

編集可能なフィールドを持つ異種アイテムの動的リストが必要です。少し複雑に思えますが、基本的にユーザーはアイテムを追加/削除できます。各アイテムは異なるタイプにすることができ(私は という名前の抽象クラスを持っており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 をオーバーライドする必要があると思いますよね?

4

1 に答える 1

0

答えは youtube.com/watch?v=wDBM6wVEO70 を見て出てきました:

このような複雑なリスト (非静的項目を含む異種の動的リスト、テキストビューのような読み取り専用項目ではないという意味での静的リスト) を実行することは可能ですが、この場合はリストビューの使用を避けることをお勧めします。それらは非常に高価で複雑です。

私が直面しているように、小さなデータセットと多くの特殊なケースの場合、スクロールビュー内にリニアレイアウトを配置し、プログラムで入力する方がはるかに簡単です。

于 2013-03-18T01:29:06.847 に答える