Android-如何使用TextWatcher更新ListView组件标记?

Android-如何使用TextWatcher更新ListView组件标记?,android,view,android-edittext,textwatcher,Android,View,Android Edittext,Textwatcher,我有一个ListView-getListView()的ListActivity。列表视图填充正确,一切正常 单击任何列表视图项后,它将打开一个对话框,其中包含4个标题文本视图和4个用户输入编号文本。我想将标记对象附加到每个EditText或ListView项上(无论多么可能),并使用TextWatcher跟踪对EditText所做的任何更改 i、 e.在Textwatcher中,如果对文本进行了任何更改,则会在相应的标签中进行更新 这将允许我将EditText文本设置为已设置的任何预先存在的值

我有一个
ListView
-
getListView()
ListActivity
列表视图
填充正确,一切正常

单击任何
列表视图
项后,它将打开一个对话框,其中包含4个标题文本视图和4个用户输入编号文本。我想将标记对象附加到每个
EditText
ListView
项上(无论多么可能),并使用
TextWatcher
跟踪对
EditText
所做的任何更改

i、 e.在
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){}       
}

任何关于这个方向的建议或指导都是非常好的

在这种情况下,根本不需要
TextWatcher
。主要问题与我的vTag对象的范围有关

TextWatcher
也会更新每个字符,这对我来说并没有什么好处,只是不必要的计算

声明我的
EditText
XML引用
final
(我分配给每个ListItem视图的标记对象的引用)意味着我可以在肯定按钮侦听器中更新标记

好处和学习成果:

  • 当用户按下肯定按钮时,仅对标记执行一次操作,而不是每次更改
    EditText
    中的字符
  • 使用final几乎总是提高速度,尽管通常会稍微提高一些
  • 这种方式还允许用户通过一个否定按钮选择退出,在这种情况下,不会发生标签更新。使用
    TextWatcher
    ,用户只需按下“取消”并全部取消,就可以进行各种更新
TextWatcher
肯定有一席之地,但这不是它

我只是想贡献我的发现和推理


干杯

我可能错了,但你的观点似乎有些混乱。当您使用view.setTag(newTag)时,您使用列表项的视图,但当您尝试在TextWatcher设置标记值时,您使用的是您的对话框视图。感谢您的输入!这是一个问题,谢谢你指出!事实证明,我根本不需要
TextWatcher
,正如我在下面的回答中所概述的那样,不过还是要谢谢你。