无法从自定义listView获取EditText值

时间:2011-12-28 12:59:03

标签: android listview

对不起,但是我不知道如何发表评论的答案,所以我必须在这里写自己的

我需要从自定义ListView(由EditText和ImageView组成)中获取String数据。 这是我的代码:

  1. 首先,我声明我自己的ArrayList副本

    private ArrayList<EditText> m_edit = null;

  2. 其次,我在我的Activity的onCreate方法中初始化它

    public void onCreate(Bundle savedInstanceState) { ...
    m_edit = new ArrayList<EditText>(); ...

  3. 第三,我使用EditText副本填充我的ArrayList,然后使用ArrayAdapter将它们添加到ListView

    fieldAddButton.setOnClickListener(new OnClickListener()
    {
        public void onClick(View view){
            EditText et = new EditText(AddCategory.this);    
            m_edit.add(et);
            m_adapter.notifyDataSetChanged();   
            }
        });   
    
  4. 第四,我想获取自定义ListView中任何项目的EditText值。所以我做这样的事情:

                for (int i = 0;i<m_edit.size();i++){
                _string = m_edit.get(i).getText().toString();
                }
    
  5. 有问题:结果总是“”

    我做错了什么?

    我的课程源代码

    import android.app.Activity;
    import android.widget.Toast;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.widget.ListView;
    import android.widget.EditText;
    import android.widget.Button;
    import android.widget.TextView;
    import java.util.ArrayList;
    import android.widget.ArrayAdapter;
    import android.view.View.OnClickListener;
    import android.view.*;
    import android.content.Intent;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MenuInflater;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class AddCategory extends Activity {
    
    private ArrayList<EditText> m_edit = null;
    private EditAdapter m_adapter;
    private EditText categoryName;
    private MyDbAdapter dbAdapter;
    private Context context;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);              
        setContentView(R.layout.addcategory);
    
        final Button categoryAddButton = (Button)findViewById(R.id.CategoryAddButton);   
        final Button fieldAddButton = (Button)findViewById(R.id.FieldAddButton);
        final ListView fieldList = (ListView)findViewById(R.id.CategoryFieldList);
    
        categoryName  = (EditText)findViewById(R.id.CategoryNameEdit);        
        m_edit = new ArrayList<EditText>();
        this.m_adapter = new EditAdapter (this, R.layout.categoryfieldlayout, m_edit);     
        fieldList.setAdapter(m_adapter);
        dbAdapter = new MyDbAdapter(this);
        context = getApplicationContext();
        dbAdapter.open();
    
        fieldAddButton.setOnClickListener(new OnClickListener()
        {
            public void onClick(View view){
                EditText et = new EditText(AddCategory.this);    
                m_edit.add(et);
                m_adapter.notifyDataSetChanged();   
                }
            });      
    
        categoryAddButton.setOnClickListener(new OnClickListener()
        {
            public void onClick(View view){
                int duration;
                String error;
                long categoryID;
                ;
                int errCount = 0;
                if (!categoryName.getText().toString().equals("")){
    
                    for (int i = 0;i<m_edit.size();i++){
                        if (m_edit.get(i).getText().toString().equals("")){
                            errCount++;
                        }
                    }
    
                    if (errCount != 0){
                        GroupItem group = new GroupItem(categoryName.getText().toString());
                        categoryID = dbAdapter.insertGroup(group);                  
                        for (int i = 0;i<m_edit.size();i++){
                                FieldItem field = new FieldItem(m_edit.get(i).getText().toString());                        
                                duration = Toast.LENGTH_SHORT;
                                error = m_edit.get(i).getText().toString();
                                Toast.makeText(context, error, duration).show();                            
                        }                       
                    }
                    else{
                        duration = Toast.LENGTH_SHORT;
                        error = "Field cannot be empty";
                        Toast.makeText(context, error, duration).show();                        
                    }
                }
                else{
                    duration = Toast.LENGTH_SHORT;
                    error = "Name cannot be empty";
                    Toast.makeText(context, error, duration).show();             
                }
            }
        });            
    
    
    
    }
    
    private class EditAdapter extends ArrayAdapter<EditText>{
        private ArrayList <EditText> items;
    
        public EditAdapter(Context context, int textViewResourceId, ArrayList<EditText> items) {
            super(context, textViewResourceId, items);
            this.items = items;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                View v = convertView;
                if (v == null) {
                    LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    v = vi.inflate(R.layout.categoryfieldlayout, null);
                }
                EditText et = (EditText)v.findViewById(R.id.fieldEdit);
                return v;
            }
    
    
            }    
    }
    

    当我更新(写一些文本)自定义listView项目的EditText字段时,我认为,m_edit不会自动更新其内容。所以问题是,如何强制进行更新

    PS。抱歉我的英语不好

4 个答案:

答案 0 :(得分:1)

从下面的代码中,我猜您从ArrayList而非EditText字段获取文字时出错。

m_edit = new ArrayList<EditText>();
for (int i = 0;i<m_edit.size();i++) {
    _string = m_edit.get(i).getText().toString();
}

只需设置ListView onClickListener,您将获得单击的每个列表视图项的Edittext值。在你的情况下......

final ListView fieldList = (ListView)findViewById(R.id.CategoryFieldList);

fieldList.setOnItemClickListener(new OnItemClickListener()  {
@Override
public void onItemClick(AdapterView<?> listView, View view, 
 int position, long id) {

 EditText et = (EditText)v.findViewById(R.id.fieldEdit);
 String myText = et.getText().toString();

 Toast.makeText(getApplicationContext(), myText , Toast.LENGTH_SHORT).show();

}
});

答案 1 :(得分:0)

你可以为你提供代码片段,以便更多地了解你在使用edittext Arraylist做什么。 从这里我可以看到你在arraylist中添加edittext并刷新listview。但你的listview是否刷新了添加的edittext或没有?那么这就是你的代码的主要问题。

答案 2 :(得分:0)

感谢您的来源,

我认为您正在使用listview,并且在按钮点击时您尝试获取edittext值。但是你怎么知道从列表视图中选择了哪个位置视图。

我认为您所询问的内容和您正在做的事情存在一些问题。我认为你正在做的是单击按钮,你试图获得所有的edittext值。

答案 3 :(得分:0)

你得到的是空白值,因为在你的列表视图中你还没有编辑它......你可以这样做。

在适配器getview方法中放入此代码

public View getView(final int position, View convertView, ViewGroup parent) {

  ed.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

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

            }

            @Override
            public void afterTextChanged(Editable s) {
                list.get(position).edittext.setText(ed.getText().toString())
            }
        });
}

希望这可以帮助你。