6

基本的な質問:ListAdapterの一部であるEditTextフィールドが数十ある場合、個々のEditTextフィールドはどの行に属しているかをどのように知ることができますか?

現在、TextWatcherを使用してテキスト入力をリッスンしています。EditTextの位置をTextWatcherのコンストラクターに渡すことができるように、TextWatcherを拡張してみました。

ただし、ソフトキーボードがポップアップすると、さまざまなEditTextフィールドに対応する位置がシャッフルされます。

EditTextフィールドを適切な位置まで追跡するにはどうすればよいですか?

私はGridViewを使用して物事をレイアウトしています。各アイテムのレイアウトは、その下にTextViewフィールドとEditTextフィールドがあるImageViewです。

各EditTextのテキストは、stringsと呼ばれるグローバルString配列に保持されます。最初は空で、TextWatcherクラスによって更新されます。

public void initList()
    {
        ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, R.layout.shape, strings)
        {
            @Override
            public View getView(final int position, View convertView, ViewGroup parent)  {
                if (convertView == null)  {
                    convertView = LayoutInflater.from(getContext()).inflate(R.layout.shape, null);
                }
                final String theData = getItem(position);
                final EditText editText = (EditText) convertView.findViewById(R.id.shape_edittext);
                editText.setText(theData);
                editText.addTextChangedListener(
                        new MyTextWatcher(position, editText)
                );

                ImageView image = (ImageView) convertView.findViewById(R.id.shape_image);
                image.setBackgroundResource(images[position]);

                TextView text = (TextView) convertView.findViewById(R.id.shape_text);
                if (gameType == SHAPES_ABSTRACT)
                    text.setText("Seq:");
                else
                    text.setVisibility(View.GONE);  

                return convertView;
            }

            @Override
            public String getItem(int position) {        return strings[position];       }
        };

        grid.setAdapter(listAdapter);
    }


private class MyTextWatcher implements TextWatcher {
    private int index;
    private EditText edittext;
    public MyTextWatcher(int index, EditText edittext) { 
               this.index = index; 
               this.edittext = edittext;    
        }
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
    public void onTextChanged(CharSequence s, int start, int before, int count) {}
    public void afterTextChanged(Editable s) {  strings[index] = s.toString();      }
    public void setIndex(int newindex) {  index = newindex;    }
}

最初のEditText(画像を参照)をクリックすると、EditTextがスマイリーフェイスの下に移動します。

EditTextフィールドがどのようにレイアウトされているかを示します

4

5 に答える 5

5

これが優れたUIデザインであるかどうかを考慮せずに、次のようにします。

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;
    }
};

*もう一度編集*

私は後世のために言わざるを得ないと感じています、私は実際にそれをこのようにコーディングしません。文字列配列よりも少し構造化されたデータが必要だと思います。文字列配列とArrayAdapterを外部で維持しているので、奇妙な並列状況になります。ただし、これは正常に機能します。

多次元配列ではなく、単一の文字列配列にデータがあります。その理由は、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
    }
}
于 2011-11-14T00:37:49.250 に答える
3

行番号を追跡するには、の各リスナーがEditTextリスト内のアイテムへの参照を保持し、を使用getPosition(item)しての位置を取得する必要がありListViewます。私の例では使用してButtonいますが、に適用できると思いますEditText

class DoubleAdapter extends ArrayAdapter<Double> {
    public DoubleAdapter(Context context, List<Double> list) {
        super(context, android.R.layout.simple_list_item_1, list);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_row, null);
        }

        // keep a reference to an item in a list
        final Double d = getItem(position);

        TextView lblId = (TextView) convertView.findViewById(R.id.lblId);
        lblId.setText(d.toString());

        Button button1 = (Button) convertView.findViewById(R.id.button1);
        button1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // the button listener has a reference to an item in the list
                // so it can know its position in the ListView
                int i = getPosition(d);
                Toast.makeText(getContext(), "" + i, Toast.LENGTH_LONG).show();
                remove(d);
            }
        });

        return convertView;
    }
}
于 2011-11-14T02:16:57.490 に答える
1

編集テキストをリストセルに保存する必要があるかどうかを検討する価値があるかもしれません。ユーザーが一度に1つしか編集しない場合は、少し不要に思えます。

アプリがどのように設計されているかはわかりませんが、ユーザーエクスペリエンスを少し考え直して、リストアイテムを押すと、編集するための単一のテキスト編集が表示されるようにすることをお勧めします。これにより、リストアダプターを使用する場合と同じように、リストアイテムの参照を取得し、ユーザーが編集している間に保存し、終了時に更新することができます。

于 2011-11-14T00:12:58.950 に答える
1

リストビューをスクロールすると、EditTextコンテンツで問題(コンテンツのシャッフル、テキストの欠落)が発生する可能性が高いため、これが優れたデザインかどうかはわかりません。m6ttのアイデアを試してみることを検討してください。

しかし、本当に自分の道を進みたいのであれば、特にTextWatcherのコードを投稿できますか?

于 2011-11-14T00:23:42.790 に答える
0

私はこれを解決しようとしました、そしてあなたが見ることができるように簡単な方法があります-それが誰かのために役立つかもしれないので私はここに答えを投稿しています。

リストビュー->テキストの編集にテキストウォッチャーがある場合、位置を取得できません。

これは私のために働いた解決策です:

ビューを取得-

テキストを編集するためにテキストウォッチャーリスナーを追加するときに、以下の行も追加しました

edittext.setTag(R.id.position<any unique string identitiy>, position)

afterTextChangedで-

 int position = edittext.getTag(R.id.position) 

正しい位置番号を指定し、位置番号に基づいて変更を行うことができます。

于 2017-04-26T12:57:59.947 に答える