2

EditText の Listview があり、確認ボタンをクリックしたときに編集された各行の文字列値を取得する必要がありますが、方法がわかりません。

一部のサンプルを適応させようとしましたが、成功しませんでした (編集された値ではなく、常にデフォルト値が取得されます)。

私の試みはこれです

public class MyActivity extends Activity {
    static int nItems;

    ImageButton confirmButton;
    ListView myList;

    ListViewAdapterEditText adapterG1, adapterG2, adapterG3;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        .....
        myList = (ListView) findViewById(R.id.listaG1);
        myList.setItemsCanFocus(true);
        adapterG1 = new ListViewAdapterEditText();
        myList.setAdapter(adapterG1);

    }

    OnClickListener mConfirmButtonListener = new OnClickListener() {
        public void onClick(View v) {
        ArrayList a1 = adapterG1.getItems();
                for (int i = 0; i < nItems; i++) {
                    System.out.println(a1.get(i)
                            + "\n\n");
        }
    };

    public class ListViewAdapterEditText extends BaseAdapter {
        private LayoutInflater mInflater;
        public ArrayList myItems = new ArrayList();
        ListItem listItem;

        public ListViewAdapterEditText() {
            mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            for (int i = 0; i < nItems; i++) {
                listItem = new ListItem();
                listItem.caption = "Caption" + i;
                myItems.add(listItem);
            }
            notifyDataSetChanged();
        }

        public int getCount() {
            return myItems.size();
        }

        public Object getItem(int position) {
            return position;
        }

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

        public ArrayList<String> getItems() {
            ArrayList<String> items = new ArrayList<String>();
            for (int i = 0; i < nItems; i++) {
                ListItem li = (ListItem) myItems.get(i);
                items.add(li.getCaption());
            }
            return items;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                holder = new ViewHolder();
                convertView = mInflater.inflate(R.layout.list_item_row,
                        null);
                holder.caption = (EditText) convertView
                        .findViewById(R.id.ItemCaption);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            // Fill EditText with the value you have in data source
            holder.caption.setText(((ListItem) myItems.get(position)).caption);
            // holder.caption.setText(myItems.get(position).caption);
            holder.caption.setId(position);

            // we need to update adapter once we finish with editing
            holder.caption
                    .setOnFocusChangeListener(new OnFocusChangeListener() {
                        public void onFocusChange(View v, boolean hasFocus) {
                            if (!hasFocus) {
                                final int position = v.getId();
                                final EditText Caption = (EditText) v;
                                ((ListItem) myItems.get(position)).caption = Caption
                                        .getText().toString();
                            }
                        }
                    });

            return convertView;
        }

        class ViewHolder {
            EditText caption;
        }

        class ListItem {
            String caption;

            public String getCaption() {
                return caption;
            }
        }
    }

}

誰かがこの問題を解決するのを手伝ってくれますか?

4

2 に答える 2

1

OnFocusChangeListener が呼び出されていますか? EditText でテキストを編集してから確認ボタンをタップすると、フォーカスがまだ EditText にあるため、このリスナーはタッチ モードで呼び出されません。

更新: 項目ビューがリサイクルされるように、ListView を確認してスクロールせずに EditText でテキストを編集した状況を考えてみましょう。 setRecyclerListener(android.widget.AbsListView.RecyclerListener) を使用して、アイテム ビューがリサイクルされたときに通知を受け取り、編集結果を保存できます。画面に表示されている EditText の結果を保存するには、getChildAt などのメソッドを使用して項目ビューを画面に表示してから、EditText のテキストを取得します。

Update2: 別のより良いクリーンな方法は、TextWatcher と addTextChangeListener を使用することです。これにより、EditText のテキストが変更されたときに通知されます。

Update3: 次のサンプルを作成してテストしたところ、携帯電話で動作しました。:)

Update4: パフォーマンスが悪く、多くのオブジェクトが作成されるため、以前のコードを削除しました。代わりに、次の完全なサンプルを確認できます。

活動コード:

package com.example.asynctasktest;

import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;

/**
 * @author Daniel Chow
 *
 * May 26, 2013 12:57:49 AM
 */
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView listView = (ListView) findViewById(R.id.listview);
        final TestAdapter adapter = new TestAdapter(this);
        listView.setAdapter(adapter);
        Button confirmButton = (Button) findViewById(R.id.confirm_button);
        confirmButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                List<String> items = adapter.getItems();
                for (int i = 0, n = items.size(); i < n; i++) {
                    Log.e("", items.get(i));
                }
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }


}

アダプターコード:

/**
 * 
 */
package com.example.asynctasktest;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;

/**
 * @author Daniel Chow
 * 
 *         May 26, 2013 1:13:02 AM */
public class TestAdapter extends BaseAdapter {

    private List<String> items = new ArrayList<String>();
    private Context context;

    public TestAdapter(Context context) {
        this.context = context;
        for (int i = 0; i < 12; i++) {
            items.add("caption " + i);
        }
    }

    public List<String> getItems() {
        return new ArrayList<String>(items);
    }

    @Override
    public int getCount() {
        return 12;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = new EditText(context);
            holder = new ViewHolder();
            holder.editText = (EditText) convertView;
            holder.watcher = new EditTextWatcher();
            holder.editText.addTextChangedListener(holder.watcher);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.watcher.setTarget(position);
        holder.editText.setText(items.get(position));
        return convertView;
    }

    private class EditTextWatcher implements TextWatcher {

        private int target;

        public void setTarget(int target) {
            this.target = target;
        }

        @Override
        public void afterTextChanged(Editable s) {
            items.set(target, s.toString());
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }

    }

    private static class ViewHolder {
        EditText editText;
        EditTextWatcher watcher;
    }

}
于 2013-05-25T15:53:13.797 に答える