请帮帮我!我的英语水平不好。 我有下面的重写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,但是listview中存在的第一项将settag。因此,新项目不要settag(),因为convertview!= null。新项目的标签将在列表视图中获得第一个项目。新项目的btnInc或btnDec上的onclick()将更改列表视图中第一个项目的值。当我重新启动程序时,该程序可以正常工作。 我希望这次程序可以正常工作。我添加了新项目,并且不重新启动程序。
答案 0 :(得分:0)
似乎您正在将列表位置分配为按钮的标签,以便在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)