Android 具有ArrayAdapter的ListView中的多个EditText无法在用户输入后获取文本
我已经实现了一个包含2行EditText的ListView多行,当前固定了2行。当用户在这两行的EditText中输入数据时,我希望将用户输入的数据显示为Toast消息,如下所示: 我使用的代码如下: 主要xml活动\u main.xml: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
<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();