在ListView中更改单个项目的TextView

时间:2018-12-07 13:46:08

标签: java android

我正在使用带有自定义项目的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(该项目的数量)?

1 个答案:

答案 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之后,再次重置该行或刷新该行。