使用 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
我的 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