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

时间:2018-07-20 02:36:22

标签: java android listview android-arrayadapter

请帮帮我!我的英语水平不好。 我有下面的重写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()将更改列表视图中第一个项目的值。当我重新启动程序时,该程序可以正常工作。 我希望这次程序可以正常工作。我添加了新项目,并且不重新启动程序。

1 个答案:

答案 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)