使用Button的setText也会触发listview中的随机项来更改文本

时间:2016-09-06 14:49:51

标签: android listview android-studio android-arrayadapter

我的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;
    }
}

1 个答案:

答案 0 :(得分:0)

ListView回收ListView项目,如果你有10个项目,当前列表显示滚动它时的5个项目ll将第1个项目作为第6个项目。添加日志以检查是否在if&amp ;;中打印视图的ID在其他情况下,您需要保持基于循环视图更新文本的逻辑。

How ListView's recycling mechanism works