0

我已经实现了一个 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 数组。

请帮我解决这个问题。如果您需要更多信息,也请告诉我。

4

1 回答 1

0

我认为问题出在这一行,当您想在以下位置显示 EditText 的内容时Toast

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

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

strDisplay += m_myDatabase[i].getID()
                    + m_myDatabase[i].getNum();
于 2014-11-02T17:04:06.847 回答