使用 Button 的 setText 还会触发列表视图中的随机项目以更改文本

setText using Button also triggers random item in listview to change text

我的 ListView 中显示了 20 个项目。所有数据都来自 mysql 数据库。我有一个按钮,在我的 onClickListener 中它将设置该按钮的文本。但是当它这样做时,它还会设置列表中其他项目的文本。当我滚动浏览列表中的项目时,它会随机更改其他按钮的文本。有些恢复为原始文本,有些设置为我输入的文本,并随着我不断滚动而不断变化。我尝试将 setText 带入和带出 if statement,但仍然没有成功。

这是我的适配器

public class myOrderListAdapter extends ArrayAdapter<myOrder> {

    public class ViewHolder{
        TextView tableNum;
        TextView itemName;
        TextView itemQuantity;
        Button btnStatus;
    }

    public myOrderListAdapter(Context context, ArrayList<myOrder> orderList) {
        super(context, 0,orderList);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final myOrder orderList = getItem(position);

        final ViewHolder viewHolder;

        if(convertView == null){
            viewHolder = new ViewHolder();

            convertView = LayoutInflater.from(getContext()).inflate(R.layout.order_list_layout,parent,false);

            viewHolder.tableNum = (TextView)convertView.findViewById(R.id.OLtableNum);
            viewHolder.itemName = (TextView)convertView.findViewById(R.id.OLitemName);
            viewHolder.itemQuantity = (TextView)convertView.findViewById(R.id.OLitemQuantity);
            viewHolder.btnStatus = (Button)convertView.findViewById(R.id.statusButton);

            convertView.setTag(viewHolder);
        }
        else {
            viewHolder = (ViewHolder)convertView.getTag();
        }

        viewHolder.tableNum.setText("Order for Table "+orderList.getTable_id());
        viewHolder.itemName.setText(orderList.getItem_name());
        viewHolder.itemQuantity.setText("QTY: " + orderList.getQuantity());

        if(orderList.getStatus_id() == 1){
            viewHolder.btnStatus.setText("Preparing");
            viewHolder.btnStatus.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    viewHolder.btnStatus.setText("Served");
                }
            });
            notifyDataSetChanged();
        }



        return convertView;
    }
}

ListView 回收 ListView 项目,如果您有 10 个项目并且当您滚动时当前列表显示 5 个项目,它会将第 1 个项目作为第 6 个项目。添加日志检查在if & else情况下打印视图ID,需要保留基于回收视图更新文本的逻辑。

How ListView's recycling mechanism works