我已经实现了一个 ListView(多行,有 2 个 EditText,当前固定为 2 行)。当用户在两行的 EditText 中输入数据时,我想将用户输入的数据显示为 Toast 消息,如下所示:
我使用的代码如下: main xml (activity_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>
适配器布局 xml(list_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>
主 Activity 类(观察实现 Toast 的函数 OnDispButClick()):
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);
}
}
阵列适配器文件:
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 数组。
请帮我解决这个问题。如果您需要更多信息,也请告诉我。