ListView 从第 5 行开始重复 EditTexts 中的相同项目

Posted

技术标签:

【中文标题】ListView 从第 5 行开始重复 EditTexts 中的相同项目【英文标题】:ListView repeats the same items in EditTexts from the 5th row 【发布时间】:2016-01-28 16:53:21 【问题描述】:

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

我有 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_
android:layout_
android:orientation="vertical"
android:shrinkColumns="*"
android:stretchColumns="*"
>

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

    <EditText
        android:id="@+id/nameTool"
        android:layout_
        android:layout_
        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_
        android:layout_
        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_
        android:layout_
        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_
        android:layout_
        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_
        android:layout_
        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;
 

【问题讨论】:

这个答案可能对第一个问题有帮助:***.com/a/7032341/3131147 非常感谢@Drenmi .. 它有效,但第二个问题仍然存在 【参考方案1】:

您好,您的第二个问题来自这里:

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

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

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

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

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

最后,在行中包含 EditText 是个坏主意。您可能应该使用 TextViews 并将您的 EditTexts 移动到其他地方。

【讨论】:

第一个问题请参考@McAdam331 评论。

以上是关于ListView 从第 5 行开始重复 EditTexts 中的相同项目的主要内容,如果未能解决你的问题,请参考以下文章

在 ListView 中重复项目?它不能正常工作,第一个项目显示在第三个位置,并再次从第一个项目重复

winform 之控件ListView

如果我使用itertool中的islice从第5行开始,如何使用DictReader?

如何计算 ListView 中的子项?

按下键后如何获取编辑文本的文本

diff 命令详解