0

カスタムアダプタを備えたリストビューがあります。各行の左側にはテキストビューがあり、右側にはユーザーがエントリ値を変更するために使用できるエディットテキストがあります。

デフォルトで各ビュー内のEditTextビューに配置される値は、アダプターに渡された文字列配列から取得されます。

ユーザーがこれらの値を編集して、結果を同じ文字列配列に保存できるようにするにはどうすればよいのでしょうか。

テキスト変更リスナーを追加してみたので、ユーザーが値を編集すると、新しい文字列が元の文字列配列の適切な位置に配置されます。これに伴う問題は、ユーザーがスクロールすると、テキスト変更リスナーがアクティブになり、配列の値が空白の文字列で上書きされることです。

ここにいくつかのコードがあります:

public EditTagsListViewAdapter(Context context, String[] objectKeys, String[] objectValues) {
        super();
        this.context = context;
        this.objectKeys = objectKeys;
        this.objectValues = objectValues;
    }

    @Override
    public int getCount() {
        return objectKeys.length;
    }

    @Override
    public String[] getItem(int position) {
        String[] item = new String[2];
        item[0] = objectKeys[position];
        item[1] = objectValues[position];
        return item;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;

        LayoutInflater mInflater = (LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.edit_osm_tag_row, null);
            holder = new ViewHolder();
            holder.key = (TextView) convertView.findViewById(R.id.tagKey);
            holder.value = (EditText) convertView.findViewById(R.id.tagValue);

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

        String[] rowItem = (String[]) getItem(position);

        holder.key.setText(rowItem[0]);
        if(rowItem[1].equals("null")) {
            holder.value.setText("");
        } else {
            holder.value.setText(rowItem[1]);
        }

        holder.value.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // TODO Auto-generated method stub

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterTextChanged(Editable s) {
                objectValues[position] = s.toString();
                Log.i(TAG, "Added changes to adapter");

            }
        });


        return convertView;
    }


    static class ViewHolder {
        protected TextView key;
        protected EditText value;
    }

変数objectValuesの値の一部が文字列「null」として設定されるため、いくつかのedittext値を空白にif(rowItem[1].equals("null")) {設定しましたが、空白で表示したいと思います。

これが理にかなっていることを願っています。誰かが私がこれを達成する方法を知っていますか?

ありがとう

4

2 に答える 2

2

一般に、データ ソースはビュー/アダプターと密結合するべきではありません。これは、ビューで使用されているかどうかに関係なく、そのデータ ソースのデータを変更できることを意味します。ユーザーがデータを変更したい場合は、ソース (配列) を更新してから、アダプター/ビューに再描画を指示するだけです。

一部のアダプターでは、コンテンツを変更すると問題が発生する場合がありますが、独自のアダプターを最初から実装している場合、または疎結合のアダプター クラスを使用している場合は、問題が発生することはありません。

BaseAdapter を拡張する Adapter を使用している場合は、単に notifyDataSetChanged() を呼び出すだけで、Adapter が残りを把握する必要があります。

于 2013-01-06T23:20:26.270 に答える
0

TextWatcherの代わりに、OnEditorActionListenerを使用して、ユーザーがキーボードの「Enter」を押したときに変更を保存できます。

editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if(actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN) {
            objectValues[position] = v.getText().toString();
            return true;
        }

        return false;
    }
});
于 2013-01-06T23:13:51.317 に答える