Android 具有ArrayAdapter的ListView中的多个EditText无法在用户输入后获取文本

Android 具有ArrayAdapter的ListView中的多个EditText无法在用户输入后获取文本,android,android-edittext,listview-adapter,Android,Android Edittext,Listview Adapter,我已经实现了一个包含2行EditText的ListView多行,当前固定了2行。当用户在这两行的EditText中输入数据时,我希望将用户输入的数据显示为Toast消息,如下所示: 我使用的代码如下: 主要xml活动\u main.xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" andr

我已经实现了一个包含2行EditText的ListView多行,当前固定了2行。当用户在这两行的EditText中输入数据时,我希望将用户输入的数据显示为Toast消息,如下所示:

我使用的代码如下: 主要xml活动\u main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.listviewtest.MainActivity" >

<ListView
    android:id="@+id/listview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/buttonDisp"
    android:layout_marginBottom="70dp" />

<Button
    android:id="@+id/buttonDisp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:text="Display Data" />

</RelativeLayout>
适配器布局xmllist_view_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="beforeDescendants"
android:orientation="horizontal" >

<EditText
    android:id="@+id/idNum"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="30dp"
    android:layout_weight="1.25"
    android:focusableInTouchMode="true"
    android:hint="Num"
    android:minWidth="80dp" />

<EditText
    android:id="@+id/idID"
    android:layout_width="156dp"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dp"
    android:ems="10"
    android:focusableInTouchMode="true"
    android:hint="ID"
    android:longClickable="false"
    android:minWidth="50dp" >

    <requestFocus />
</EditText>

</LinearLayout>
主活动类观察DispBut上的函数单击Toast的实现位置:

public class MainActivity extends ActionBarActivity {

private int m_nNumOfRows = 3;
private MyDatabase[] m_myDatabase;
private ListView m_listview;//
private ArrayAdapterItem m_myDatabaseAdapterItem;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    init();
    initAdapter();
    OnDispButClick();
}

// Class where Toast is handled
private void OnDispButClick() {
    // TODO Auto-generated method stub
    Button dispBut = (Button) findViewById(R.id.buttonDisp);
    dispBut.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (v.getId() == R.id.buttonDisp) {
                // Display
                String strDisplay = "";
                for (int i = 0; i < m_nNumOfRows; i++) {
                    strDisplay += m_myDatabase[i].getNum()
                            + m_myDatabase[i].getID();
                }
                Toast.makeText(getApplicationContext(), strDisplay,
                        Toast.LENGTH_SHORT).show();
            }
        }
    });

}

private void init() {
    // TODO Auto-generated method stub
    m_nNumOfRows = 2;
    m_listview = (ListView) findViewById(R.id.listview);
}

private void initAdapter() {
    // TODO Auto-generated method stub

    m_myDatabase = new MyDatabase[m_nNumOfRows];

    for (int i = 0; i < m_nNumOfRows; i++) {
        m_myDatabase[i] = new MyDatabase("", "");
    }

    m_myDatabaseAdapterItem = new ArrayAdapterItem(this,
            R.layout.list_view_layout, m_myDatabase);
    m_listview.setAdapter(m_myDatabaseAdapterItem);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}
}
ArrayAdapter文件:

public class ArrayAdapterItem extends ArrayAdapter<MyDatabase> {

Context mContext;
int layoutResourceId;
MyDatabase data[] = null;

public ArrayAdapterItem(Context mContext, int layoutResourceId,
        MyDatabase[] data) {

    super(mContext, layoutResourceId, data);

    this.layoutResourceId = layoutResourceId;
    this.mContext = mContext;
    this.data = data;
}

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

    ViewHolder holder;
    final MyDatabase MyDatabase = data[position];
    if (convertView == null) {

        // inflate the layout
        LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
        convertView = inflater.inflate(layoutResourceId, parent, false);
        holder = new ViewHolder();
        holder.editTextId = (EditText) convertView
                .findViewById(R.id.idID);
        holder.editTextNum = (EditText) convertView
                .findViewById(R.id.idNum);
        holder.editTextId.setText(MyDatabase.getID());
        holder.editTextNum.setText(MyDatabase.getNum());
        convertView.setTag(holder);

    } else {
        holder = (ViewHolder) convertView.getTag();
        ViewHolder viewHolder = (ViewHolder) convertView.getTag();
        holder.editTextId = viewHolder.editTextId;
        holder.editTextNum = viewHolder.editTextNum;
        holder.editTextId.setText(MyDatabase.getID());
        holder.editTextNum.setText(MyDatabase.getNum());

    }

    holder.editTextNum.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            // TODO Auto-generated method stub
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub
        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
            MyDatabase.setNum(s.toString());
        }
    });

    holder.editTextId.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            // TODO Auto-generated method stub
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub
        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub
            MyDatabase.setID(s.toString());
        }
    });

    return convertView;
}

static class ViewHolder {
    EditText editTextNum;
    EditText editTextId;
};
}
每当用户在使用ArrayAdapter实现的ListView的editText中输入数据时,必须更新我的数据库:

public class MyDatabase  implements Comparable<MyDatabase>
{

private String m_strNum;
private String m_strID;

public MyDatabase(String strNum,String strID) {
    m_strNum = strNum;
    m_strID = strID;
}

public void setData(String strNum,String strID)
{
    m_strNum = strNum;
    m_strID = strID;
}

public void setNum(String strNum)
{
    m_strNum = strNum;
}

public void setID(String strID)
{
    m_strID = strID;
}

public String getNum()
{
    return m_strNum;
}

public String getID()
{
    return m_strID;
}

@Override
public int compareTo(MyDatabase another) {
    return 1;
}
}
每当用户按下按钮DisplayData时,我最终希望基于Listview中的EditBox数据更新MyDatabaseClass数组


请帮我把这个修好。如果您需要更多信息,也请告诉我。

我认为问题出在这一行,当您想在Toast中显示EditText的内容时:

在适配器中设置ID和Num等字段时,会显示两次ID。我认为应该是:

strDisplay += m_myDatabase[i].getID()
                    + m_myDatabase[i].getNum();

是的,有个错误。我已经修好了。但是,问题尚未解决请帮助我解决此问题。
strDisplay += m_myDatabase[i].getID()
                    + m_myDatabase[i].getNum();