对不起,但是我不知道如何发表评论的答案,所以我必须在这里写自己的
我需要从自定义ListView(由EditText和ImageView组成)中获取String数据。 这是我的代码:
首先,我声明我自己的ArrayList副本
private ArrayList<EditText> m_edit = null;
其次,我在我的Activity的onCreate方法中初始化它
public void onCreate(Bundle savedInstanceState) {
...
m_edit = new ArrayList<EditText>();
...
第三,我使用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();
}
});
第四,我想获取自定义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。抱歉我的英语不好
答案 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())
}
});
}
希望这可以帮助你。