我正在使用带有自定义项目的ListView制作购物清单,并有可能增加该项目的数量并减少其数量。
目前,当我将它们加载到购物清单中时,我得到的物品数量正确,如下图所示:
the image of the ListView and problem
但是,当我尝试通过单击按钮来增加/减少每个项目的数量时,就会出现问题,单击只会更新ListView中的最后一个项目。
这样做的原因是因为我为每个项目重新声明了TextView,而其他项目(可能是?)没有存储在任何地方。因此,我阅读了有关“ setTag()”和“ getTag()”的内容,并尝试实现,但这都不起作用(也许是因为我做错了)。
我正在使用一个名为“ Item”的自定义类,该类存储每个项目和该项目的金额。 否则,这是自定义适配器和.xml
public class ShoppingListAdapter extends ArrayAdapter<Item> {
int amount;
TextView amountText;
private Context mContext;
int mResource;
public ShoppingListAdapter(@NonNull Context context, int resource, @NonNull ArrayList<Item> objects) {
super(context, resource, objects);
mContext = context;
mResource = resource;
}
@NonNull
@Override
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
//get the item information
String name = getItem(position).getName();
String brand = getItem(position).getBrand();
int id = getItem(position).getId();
String img = getItem(position).getImg();
amount = getItem(position).getAmount();
//all info
Item item = new Item(name,id,brand,img);
LayoutInflater inflater = LayoutInflater.from(mContext);
convertView = inflater.inflate(mResource,parent,false);
TextView tVName = (TextView) convertView.findViewById(R.id.textView2);
ImageView imgV = (ImageView) convertView.findViewById(R.id.imageView);
TextView tVId = (TextView) convertView.findViewById(R.id.textView3);
amountText = (TextView) convertView.findViewById( R.id.amountItem );
tVName.setText(name);
amountText.setText( String.valueOf( amount ) );
amountText.setTag(position);
Picasso.with(mContext).load(img).into(imgV); // tVBrand.setText(brand);
//tVId.setText(id);
//Buttons
Button addButton =(Button) convertView.findViewById(R.id.addValue);
Button subButton =(Button) convertView.findViewById(R.id.subValue);
addButton.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
getItem(position).incrementAmount();
//This gives the right position and the amount for all items
Log.d("ifIncreased", " " + getItem(position).getAmount());
Log.d("ifIncreased", position + "" );
TextView newText = (TextView) amountText.getTag(position);
newText.setText( String.valueOf( getItem(position).getAmount()));
}
} );
subButton.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View view) {
if(getItem(position).getAmount() == 1)
{
//TODO remove from list;
}
else{
getItem(position).decrementAmount();
Log.d("ifIncreased", position + "" );
amountText.setText( String.valueOf( getItem(position).getAmount()) );
}
}
} );
return convertView;
}
和XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:weightSum="100">
<ImageView
android:id="@+id/imageView"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_weight="33.3"
app:srcCompat="@mipmap/ic_launcher" />
<LinearLayout
android:layout_width="212dp"
android:layout_height="60dp"
android:layout_weight="33.3"
android:orientation="vertical">
<TextView
android:id="@+id/textView3"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_below="@+id/textView2"
android:gravity=""
android:paddingLeft="10dp"
android:text="TextView3" />
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="30dp"
android:gravity=""
android:paddingLeft="10dp"
android:text="TextView2" />
</LinearLayout>
<LinearLayout
android:layout_width="112dp"
android:layout_height="60dp"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:id="@+id/amountItem"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:text="1"
android:textStyle="bold" />
<Button
android:id="@+id/addValue"
android:layout_width="40dp"
android:layout_height="33dp"
android:layout_gravity="center"
android:text="+"
android:textAlignment="center"
android:textSize="12sp" />
<Button
android:id="@+id/subValue"
android:layout_width="40dp"
android:layout_height="33dp"
android:layout_gravity="center"
android:text="–"
android:textAlignment="center"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>
所以-由于我在onClick函数中具有正确的值,所以我的问题是,如何从完整列表中的项目更改每个TextView(该项目的数量)?
答案 0 :(得分:1)
尝试此操作以将单个值更新为适配器。.使公共方法生效,并在更新任何值并刷新适配器时将该方法调用为片段或活动。
/**
* this method used to update list item when broad cast received.
* @param percentage
* @param position
*/
public void updateProgress(double percentage, final int position) {
feedBackVoList.get(position).setPercentage(percentage);
notifyItemChanged(position);
}
在调用 notifyItemChanged(position)时,将更新后的值设置为textview之后,再次重置该行或刷新该行。