不要为添加到列表视图中的新项目设置标签
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)
请帮帮我!我的英语水平不好。 我在下面覆盖了 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)