【问题标题】:Cant get EditText value from custom listView无法从自定义 listView 中获取 EditText 值
【发布时间】:2011-12-28 12:59:02
【问题描述】:

对不起,我无法发布 cmets 以获得答案,所以我必须在这里写自己的

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

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

还有一个问题:结果总是""

我做错了什么?

我的课源代码

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。对不起我的英语不好

【问题讨论】:

  • 一旦您单击 fieldAddButton,您将获得 editText 值。顺便说一句,您在哪里调用 for 循环。

标签: android listview


【解决方案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();

}
});

【讨论】:

    【解决方案2】:

    您能否提供代码 sn-ps 以便更多地了解您在使用 edittext Arraylist 做什么。 从这里我可以看到你在arraylist中添加edittext并刷新你的listview。但是您的列表视图是否通过添加的编辑文本刷新了?那么这就是你的代码的主要问题。

    【讨论】:

    • 我已经编辑了我的帖子并添加了孔源代码。希望能帮助到你。谢谢
    【解决方案3】:

    感谢您的来源,

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

    我认为你在问什么和你在做什么有一些问题。我认为您正在做的是单击单个按钮尝试获取所有 edittext 值。

    【讨论】:

    • 我需要做的是将我的 ListView 的所有 editText 值保存在数据库表中。为此,我尝试使用 ArrayList 来存储我的 ListView 中的所有 EditText。并从中读取数据。但我有一个问题:我不知道,如果 listView 中有任何更改(例如用户输入了一些文本),如何更新 ArrayList。类似的东西。谢谢
    【解决方案4】:

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

    在您的适配器 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())
                }
            });
    }
    

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-01-03
      • 2013-01-12
      • 2016-05-06
      • 1970-01-01
      • 2016-09-24
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 2011-10-01
      相关资源
      最近更新 更多