不要为添加到列表视图中的新项目设置标签

Do not settag for new items that is added into listview

请帮帮我!我的英语水平不好。 我在下面覆盖了 getView() 函数:

public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    ViewObjectHolder viewObjectHolder;
    if (convertView == null) {
        convertView = LayoutInflater.from(context).inflate(R.layout.row_list_menu, parent, false);
        viewObjectHolder = new ViewObjectHolder();
        viewObjectHolder.tvNameDrink = (TextView) convertView.findViewById(R.id.tvNameDrink);
        viewObjectHolder.tvPriceDrink = (TextView) convertView.findViewById(R.id.tvPriceNameDrink);
        viewObjectHolder.tvNumber = (TextView) convertView.findViewById(R.id.tvnumber);
        viewObjectHolder.btnInc = (Button) convertView.findViewById(R.id.btnInc);
        viewObjectHolder.btnDec = (Button) convertView.findViewById(R.id.btnDec);
        viewObjectHolder.tvTotalPrice = (TextView) convertView.findViewById(R.id.tvToltalPrice);

        convertView.findViewById(R.id.btnDec).setTag(position);
        convertView.findViewById(R.id.btnInc).setTag(position);
        convertView.setTag(viewObjectHolder);

    } else {
        viewObjectHolder = (ViewObjectHolder) convertView.getTag();
    }

    setViewObject(viewObjectHolder, position);

    return convertView;
}

public void setViewObject(ViewObjectHolder viewObjectHolder, int position) {
    Object_List_Menu object_list_menu = list_object_menus.get(position);
    viewObjectHolder.tvNameDrink.setText(String.valueOf(position + 1));
    viewObjectHolder.tvNameDrink.setText(object_list_menu.getStrNameDrink());
    viewObjectHolder.tvPriceDrink.setText(object_list_menu.getStrPriceDrink());
    viewObjectHolder.tvNumber.setText(object_list_menu.getStrNumber());
    viewObjectHolder.btnInc.setText(object_list_menu.getStrInc());
    viewObjectHolder.btnDec.setText(object_list_menu.getStrDec());
    viewObjectHolder.tvTotalPrice.setText(object_list_menu.getStrTotalPrice());
}

row_list_menu.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <TextView
        android:id="@+id/tvNameDrink"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:gravity="left"
        android:textSize="@dimen/font_size"
        android:text="Cafe"/>
    <TextView
        android:id="@+id/tvPriceNameDrink"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textSize="@dimen/font_size"
        android:text="40"/>

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="62dp">

    <TextView
        android:id="@+id/tvnumber"
        android:layout_width="133dp"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="0"
        android:textSize="@dimen/font_size" />

    <LinearLayout
        android:layout_width="69dp"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <Button
            android:id="@+id/tvInc"
            android:layout_width="match_parent"
            android:layout_height="30dp"
            android:gravity="center"
            android:onClick="onClickBtnInc"
            android:text="^"
            android:textStyle="bold"
            android:textSize="14sp" />

        <Button
            android:id="@+id/tvDec"
            android:layout_width="match_parent"
            android:layout_height="32dp"
            android:gravity="center"
            android:onClick="onClickBtnDnc"
            android:text="v"
            android:textStyle="bold"
            android:textSize="10sp" />
    </LinearLayout>

    <TextView
        android:id="@+id/tvToltalPrice"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center|right"
        android:text="0"
        android:textSize="@dimen/font_size" />

</LinearLayout>

我向文件(外部存储)添加了一个项目并加载到列表视图中。然后,我将新项目添加到文件,adapter.notifyDataSetChanged() 更新 lisview。当我添加新项目时,调用 getView() 函数,此时 convertview 为 null,但列表视图中存在的第一项将设置标签。所以新项目不要 settag() 因为 convertview != null。新项目的标签将获得列表视图中的第一项。 btnInc 或新项目的 btnDec 上的 onclick() 将更改列表视图中第一个项目的值。当我重新启动程序时,程序可以正常工作。 我希望这个程序这次能正常工作。我添加了新项目并且没有重新启动程序。

您似乎将列表位置指定为 if 块内用于递增和递减的按钮的标签,只有在创建新视图时才会到达,而不是在重新使用时到达。我没有看到随您的问题一起发布的点击处理程序,但是如果按钮点击处理程序中使用了该标签,则该位置将对应于首次创建时视图在列表中的位置,而不是当前位置可能是你的问题。

移动这些作业

    convertView.findViewById(R.id.btnDec).setTag(position);
    convertView.findViewById(R.id.btnInc).setTag(position);

在 setViewObject(..) 中可能会解决问题。

此外,我建议使用生成的视图 ID 将标签分配给视图,而不是为视图设置全局标签,因为这可能会与与该视图交互的其他实现发生冲突。 https://developer.android.com/reference/android/view/View.html#setTag(int,%20java.lang.Object)