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 中重复项目?它不能正常工作,第一个项目显示在第三个位置,并再次从第一个项目重复