我已尝试过多种方法来防止重复项目出现在每一行中,但无法弄清楚。
我有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;
}
}
答案 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移动到其他位置。