Android getView方法工作不正常-添加额外的空行
我正在尝试构建一个Android getView方法工作不正常-添加额外的空行,android,listview,android-arrayadapter,Android,Listview,Android Arrayadapter,我正在尝试构建一个ArrayAdapter,它将输出一行以及该行中项目的数量。然而,我得到了一个额外的行被添加每一次不想要的效果 我不知道我的逻辑出了什么问题,但我确信这是个小问题。下面是我的getView()方法: public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if(v == null){ LayoutInflat
ArrayAdapter
,它将输出一行以及该行中项目的数量。然而,我得到了一个额外的行被添加每一次不想要的效果
我不知道我的逻辑出了什么问题,但我确信这是个小问题。下面是我的getView()
方法:
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if(v == null){
LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.order_row, null);
}
item = dishes.get(position);
if(lastItem != null){
if(!lastItem.getName().equals(item.getName())){
dishName = (TextView)v.findViewById(R.id.dishName);
dishPrice = (TextView)v.findViewById(R.id.dishPrice);
dishName.setText(item.getName());
dishPrice.setText(String.valueOf(item.getPrice()));
dishQty = (TextView)v.findViewById(R.id.dishQty);
dishQty.setText(String.valueOf(item.getQty()));
}
}
else{
dishName = (TextView)v.findViewById(R.id.dishName);
dishPrice = (TextView)v.findViewById(R.id.dishPrice);
dishName.setText(item.getName());
dishPrice.setText(String.valueOf(item.getPrice()));
dishQty = (TextView)v.findViewById(R.id.dishQty);
dishQty.setText(String.valueOf(item.getQty()));
}
lastItem = item;
return v;
}
目前我的输出是这样的
Chicken QUANTITY
2.99 2
然后,如果我添加一个新项目,数量会按预期增加,但会添加另一行:
DISH NAME QUANTITY
DISH PRICE 0
你知道我做错了什么吗
列表中的每一项都属于MenuItem
I类型,增加数量如下:
public void incQty(){
qty++;
}
这是MenuItem
Array AdaptergetView()
public View getView(final int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.menuitem_row, null);
v.setFocusable(true);
}
// assign values to view
final MenuItem item = this.menuItems.get(position);
TextView nameView = (TextView) v.findViewById(R.id.item_name);
final TextView priceView = (TextView) v.findViewById(R.id.item_price);
nameView.setText(item.getName() + " ");
priceView.setText("€" + String.valueOf(item.getPrice()));
// number picker
np = (NumberPicker) v.findViewById(R.id.numpick);
np.setMaxValue(20);
np.setMinValue(0);
np.setValue(0);
np.setFocusable(false);
// calculation occurs when values are changed...
np.setOnValueChangedListener(new OnValueChangeListener() {
public void onValueChange(NumberPicker picker, int oldVal,
int newVal) {
//Add to order - increment price
if (newVal > oldVal) {
total = (item.getPrice() * newVal) - item.getPrice()
* oldVal;
Order.getInstance().addToOrder(item);
item.incQty();
amount += total;
Order.getInstance().setAmount(amount);
Toast.makeText(picker.getContext(), "Item Added: " + item.getName() + " Size: " + Order.getInstance().getOrderItems().size(), Toast.LENGTH_SHORT).show();
confirmBtn.setVisibility(View.VISIBLE);
}
//remove from order - decrement price
if (newVal < oldVal) {
total = (item.getPrice() * oldVal) - item.getPrice()
* newVal;
Order.getInstance().removeFromOrder(position);
item.decQty();
amount -= total;
Order.getInstance().setAmount(amount);
Toast.makeText(picker.getContext(), "Item removed: " + item.getName() + " Size: " + Order.getInstance().getOrderItems().size(), Toast.LENGTH_SHORT).show();
if(Order.getInstance().getOrderItems().size() == 0){
confirmBtn.setVisibility(View.INVISIBLE);
}
}
//update the text view price.
price.setText("€" + String.valueOf(Order.getInstance().getAmount()));
}
});
return v;
}
public View getView(最终int位置、视图转换视图、视图组父视图){
视图v=转换视图;
如果(v==null){
LayoutInflater vi=(LayoutInflater)getContext().getSystemService(
上下文。布局(充气机和服务);
v=vi.充气(R.布局.菜单项,空);
v、 设置聚焦(真);
}
//为视图指定值
最终菜单项=this.menuItems.get(位置);
TextView name视图=(TextView)v.findViewById(R.id.item_name);
最终文本视图价格视图=(文本视图)v.findviewbyd(R.id.item_价格);
nameView.setText(item.getName()+);
priceView.setText(“€”+String.valueOf(item.getPrice());
//数字选择器
np=(NumberPicker)v.findViewById(R.id.numpick);
np.setMaxValue(20);
np.setMinValue(0);
np.setValue(0);
np.setFocusable(假);
//值更改时会进行计算。。。
np.setOnValueChangedListener(新的OnValueChangeListener(){
值更改时的公共无效(编号picker picker、int oldVal、,
int newVal){
//添加到订单-增量价格
如果(newVal>oldVal){
总计=(item.getPrice()*newVal)-item.getPrice()
*奥德瓦尔;
Order.getInstance().addToOrder(项);
item.incQty();
金额+=总额;
Order.getInstance().setAmount(金额);
Toast.makeText(picker.getContext(),“Item Added:”+Item.getName()+“Size:”+Order.getInstance().getOrderItems().Size(),Toast.LENGTH_SHORT).show();
确认设置可见性(视图可见);
}
//从订单中删除-减价
if(newVal
您必须检查适配器的getCount()方法。
getCount()方法用于确定将从getView()方法创建多少行
例如,如果getCount()返回5,则listview中将有5行。因此,请检查getCount(),您可能会覆盖它以使其返回正确的行数。您的意思是不是说,不是鸡的数量增加到3,而是添加了一个全新的行?不,鸡的数量将增加到3,但每次都会添加另一行,其中包含空白数据。我认为问题不在适配器代码中,您必须提供更多的代码上下文。为什么要使用lastitem?ArrayAdapter循环本身自动实现我只是认为我需要一个变量来记录最后一项,以便将其与数组中的下一项进行比较