ListView在第5行的EditTexts中重复相同的项目

时间:2015-10-28 18:44:17

标签: android xml listview android-listview

我已尝试过多种方法来防止重复项目出现在每一行中,但无法弄清楚。

我有2个XML布局。第一行中有4 EditTexts和1 TextView。第二个有一个Button,点击后会向第一个添加更多项目。

现在有两个主要问题:

首先,当我按下Button四次并填写EditText字段时,ListView不会移动到我添加的最后一行。它只是挂在第5行,迫使我触摸ListView并向下滚动。

其次,当我滚动ListView时,其余5行会重复其余行,删除旧信息,并用错误的信息替换它。

XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rRow"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:shrinkColumns="*"
android:stretchColumns="*"
>

<TableRow
    android:id="@+id/tv_Row"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="1dp"
    android:background="@drawable/row_shap"
    android:padding="1dip"
    android:weightSum="5">

    <EditText
        android:id="@+id/nameTool"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1.8"
        android:gravity="center"
        android:maxLength="14"
        android:hint="Item's Name"
        android:textColor="@color/black"
        android:textSize="9sp"
        android:textStyle="bold"
        android:typeface="serif"
        android:imeOptions="actionNext">

        <requestFocus />
    </EditText>


    <EditText
        android:id="@+id/qntTool"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.80"
        android:gravity="center"
        android:hint="Qty"
        android:maxLength="2"
        android:numeric="integer"
        android:textColor="@color/black"
        android:textSize="9sp"
        android:textStyle="bold"
        android:typeface="serif"
        android:nextFocusRight="@+id/nameTool"
        android:imeOptions="actionNext"/>

    <EditText
        android:id="@+id/xTool"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.80"
        android:gravity="center"
        android:hint="X"
        android:maxLength="4"
        android:numeric="integer"
        android:textColor="@color/black"
        android:textSize="9sp"
        android:textStyle="bold"
        android:typeface="serif"
        android:nextFocusRight="@+id/qntTool"
        android:imeOptions="actionNext"/>


    <EditText
        android:id="@+id/yTool"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.80"
        android:gravity="center"
        android:hint="Y"
        android:maxLength="2"
        android:numeric="integer"
        android:textColor="@color/black"
        android:textSize="9sp"
        android:textStyle="bold"
        android:typeface="serif"
        android:nextFocusRight="@+id/xTool"
        android:imeOptions="actionNext"/>

    <TextView
        android:id="@+id/rsltTool"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.80"
        android:gravity="center"
        android:hint="result"
        android:maxLength="7"
        android:textColor="@color/black"
        android:textSize="9sp"
        android:textStyle="bold"
        android:typeface="serif"/>
   </TableRow>
</RelativeLayout>

这是一项活动

public class CalculatDetails extends Activity {

    ListView listView;
    RowAdapter rowAdapterObj;
    ArrayList<MyRow> objsArrayList

    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.list_appliance_layout1);

      listView = (ListView) findViewById(R.id.lst);
      initRows();
  }

public void initRows() {

    objsArrayList = new ArrayList<>();
    objsArrayList.add(new MyRow());
    rowAdapterObj = new RowAdapter(getBaseContext(),android.R.layout.simple_list_item_1, objsArrayList);
    listView.setAdapter(rowAdapterObj);
  }

public void btnAdd(View view) {
    objsArrayList.add(new MyRow());
    rowAdapterObj.notifyDataSetChanged();
  }

}



class RowAdapter extends ArrayAdapter<MyRow> {

  Context context;
  MyRow rowPosition;
  private ArrayList<MyRow> objects;

public RowAdapter(Context context, int textViewResourceId, ArrayList<MyRow> objects) {
    super(context, textViewResourceId, objects);
    this.objects = objects; //objects;
    this.context = context;
  }

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return this.objects.size();
  }

@Override
public MyRow getItem(int position) {
    // TODO Auto-generated method stub
     return this.objects.get(position);

  }

@SuppressLint("NewApi")
public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder = new ViewHolder();

    rowPosition = this.objects.get(position);


    if (convertView == null) {
        LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        convertView = mInflater.inflate(R.layout.details_list_row, parent, false);

        holder.edtxtNameItem = (EditText) convertView.findViewById(R.id.nameTool);
        holder.edtxtQuantityItem = (EditText) convertView.findViewById(R.id.qntTool);
        holder.edtxtXItem = (EditText) convertView.findViewById(R.id.xTool);
        holder.edtxtYItem = (EditText) convertView.findViewById(R.id.yTool);
        holder.txtvResult = (TextView) convertView.findViewById(R.id.rsltTool);


        convertView.setTag(holder);

     } else {

        holder = (ViewHolder) convertView.getTag();
    }

    rowPosition.setNameItem(holder.edtxtNameItem.getText().toString());
    rowPosition.setQntItem(holder.edtxtQuantityItem.getText().toString());
    rowPosition.setXItem(holder.edtxtXItem.getText().toString());
    rowPosition.setYItem(holder.edtxtYItem.getText().toString());
    try {
        holder.edtxtNameItem.setText(rowPosition.getNameItem());
        holder.edtxtQuantityItem.setText(rowPosition.getQntItem());
        holder.edtxtXItem.setText(rowPosition.getXItem());
        holder.edtxtYItem.setText(rowPosition.getYItem());
      } catch (Exception e) {
          e.printStackTrace();
        }
  return convertView;
 }


class ViewHolder {
    EditText edtxtNameItem;
    EditText edtxtQuantityItem;
    EditText edtxtXItem;
    EditText edtxtYItem;
    TextView txtvResult;
 }
}

1 个答案:

答案 0 :(得分:0)

您好第二个问题来自:

...
rowPosition.setNameItem(holder.edtxtNameItem.getText().toString());

...
try{
    holder.edtxtNameItem.setText(rowPosition.getNameItem());
}...

这里的问题是,当调用getView()时,你将覆盖rowPosition中的内容以及视图中显示的内容。您应该删除rowPosition.set ... rowPosition只应在创建对象时更新。因此,在getView()方法中删除所有使用rowPosition setter的行。

您应该为您的行创建一个新的构造函数,或者只是在此方法中添加您的setter:

public void btnAdd(View view) {
    objsArrayList.add(new MyRow());
    // Set your row params here
    rowAdapterObj.notifyDataSetChanged();
}

最后在你的行中包含EditText是个坏主意。您应该使用TextViews并将EditTexts移动到其他位置。