0

私はListView-getListView()の- を持っていListActivityます。はListView正しく設定されており、問題ありません。

いずれかのListView項目をクリックすると、4 つのタイトル TextView と 4 つのユーザー入力 Number EditText で構成されるダイアログが開きます。可能であれば、それらのそれぞれEditTextまたはアイテムに Tag オブジェクトをアタッチし、.ListViewEditTextTextWatcher

つまりTextwatcher、テキストに変更が加えられた場合、対応するタグで更新されます。

これにより、EditText既に設定されている既存の値にテキストを設定できます。

問題は、ダイアログが表示されたら、EditText値を入力し、正のボタンを押して閉じることです。値を表示する前に再度開いてタグを取得してEditText値を設定すると、それらはすべて0になります(位置を除く-これは重要ではありません)

私の onListItemClick コードを以下に示します。

// On Routine Selected
@Override
protected void onListItemClick(ListView l, View view, int position, long id)
{       
    // Get the tag from 'v'
    if (view.getTag() == null)
    {           
        // Create a new Set object and set that as the tag
        Set newTag = new Set(position);         
        view.setTag(newTag);
    }

    // Getting the Set tag from the ListView item
    Set vTag = (Set) view.getTag();

    /* ** Now an AlertDialog is presented to the user with a custom inflated view including EditTexts ** */

    // Getting an inflater (getLayoutInflater()) also works
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    // Inflating the XML defined layout as a view
    final View setView = inflater.inflate(R.layout.set_dialog, null);

    // Get EditText XML references
    EditText etReps = (EditText) setView.findViewById (R.id.etReps);
    EditText etIntensity = (EditText) setView.findViewById (R.id.etIntensity);
    EditText etPosition = (EditText) setView.findViewById (R.id.etPosition);
    EditText etChange = (EditText) setView.findViewById (R.id.etChange);        

    Log.d(TAG, "vTag.getReps(): " + (vTag.getReps() + 1));

    try
    {
        // Set the EditText values to values from the Set Tag
        etReps.setText(String.valueOf(vTag.getReps()));
        etIntensity.setText(String.valueOf(vTag.getIntensity()));
        etPosition.setText(String.valueOf(vTag.getPositionInExercise()));
        etChange.setText(String.valueOf(vTag.getIntensityChange()));        

        // Add Custom TextWatcher listener to all EditTexts
        etReps.addTextChangedListener(new MyTextWatcher(setView));
        etIntensity.addTextChangedListener(new MyTextWatcher(setView));
        etPosition.addTextChangedListener(new MyTextWatcher(setView));
        etChange.addTextChangedListener(new MyTextWatcher(setView));
    }
    catch (Exception e)
    {
        Toast.makeText(this, e.toString(), Toast.LENGTH_SHORT).show();
    }

    // Create a new Builder to create the dialog
    AlertDialog.Builder builder = new AlertDialog.Builder(ExerciseList.this);   

    builder.setTitle(vTag.getName());
    builder.setView(setView);       

    builder.setPositiveButton("Save", new OnClickListener()
    {
        @Override
        public void onClick(DialogInterface dialog, int which)
        {
            if (which == dialog.BUTTON_POSITIVE)
            {
//              setView.setTag(tag);
                dialog.dismiss();
            }
        }           
    });

    builder.show();
}   

MyTextWatcher コード..

//Custom Watcher
class MyTextWatcher implements TextWatcher
{
    View view;

    public MyTextWatcher(View setView)
    {
        view = setView;
    }

    @Override
    public void afterTextChanged(Editable editable)
    {
        String newText = editable.toString();
        Set tag = (Set) view.getTag();

        switch (view.getId())
        {
        case R.id.etReps:
            tag.setReps(Integer.parseInt(newText));
            break;

        case R.id.etIntensity:
            tag.setIntensity(Integer.parseInt(newText));
            break;

        case R.id.etPosition:
            tag.setPositionInExercise(Integer.parseInt(newText));
            break;

        case R.id.etChange:
            tag.setIntensityChange(Integer.parseInt(newText));
            break;
        }       
    }

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

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

方向へのアドバイスや操縦は素晴らしいでしょう!

4

1 に答える 1

0

この場合、 aTextWatcherはまったく必要ありません。主な問題は、vTag オブジェクトのスコープに関係していました。

TextWatcherすべての文字も更新されますが、それは私にはあまりメリットがなく、不必要な計算です.

EditTextXML 参照final(各 ListItem ビューの Tag オブジェクトに割り当てたもの) を宣言することは、正の Button リスナーでタグを更新できることを意味します。

利点と学習成果:

  • 内のすべての文字の変更とは対照的に、ユーザーが肯定的なボタンを押したときに、タグを使用した操作を 1 回だけ実行しますEditText
  • final を使用すると、ほとんどの場合速度が向上しますが、通常はわずかに増加します。
  • この方法では、ユーザーが否定ボタンでオプトアウトすることもできます。この場合、タグの更新は行われません。ではTextWatcher、ユーザーが [キャンセル] を押してすべてを無効にするだけで、あらゆる種類の更新が行われます。

TextWatcher definitely has a place, however this wasn't it.

Just thought I'd contribute my finding and reasoning!

Cheers

于 2013-01-16T12:13:06.967 に答える