0

我一直在試圖弄清楚大約2周,但沒有運氣。我試圖通過使用AlertDialog在我的onClickListener中添加一條確認消息,並且AlertDialog的setPositiveButton將成爲我想要發生的事情的一個,但它會混淆getView中的int position值。不是獲取我點擊的項目的位置,而是獲取最後一項的位置。我試圖做Toast消息onClick內(AlertDialog中),它返回正確的位置,但是當我嘗試Toast消息AlertDialog內它改變了位置值。我卡住了,不知道如何使這項工作。在Button.onClick中使用AlertDialog在ArrayAdapter中弄亂了getView(int的位置)的值

這裏是我的Adapter.Class

public class myOrderAdapter extends ArrayAdapter<myOrder> { 

    AlertDialog.Builder builder; 
    AlertDialog ad; 

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

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     final myOrder orderList = getItem(position); 

     ViewHolder viewHolder; 
     viewHolder = new ViewHolder(); 

     if(convertView == null){ 

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

      viewHolder.tableNum = (TextView)convertView.findViewById(R.id.tableNum); 
      viewHolder.itemName = (TextView)convertView.findViewById(R.id.itemName); 
      viewHolder.custName = (TextView)convertView.findViewById(R.id.custName); 
      viewHolder.itemQuantity = (TextView)convertView.findViewById(R.id.itemQuantity); 
      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.custName.setText("Customer Name: " + orderList.getCust_name()); 
     viewHolder.itemQuantity.setText("QTY: " + orderList.getQuantity()); 


     builder = new AlertDialog.Builder(Order.context); 
     builder.setTitle("Confirmation"); 
     builder.setIcon(R.drawable.ic_confirm); 
     builder.setMessage("Is this Ready to Serve?"); 


     builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialogInterface, int i) { 
       Toast.makeText(getContext(),orderList.getOrder_id()+ "+" + orderList.getItem_name() + "+" + position,Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     builder.setNegativeButton("No", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialogInterface, int i) { 
       dialogInterface.dismiss(); 
      } 
     }); 


     ad = builder.create(); 

     viewHolder.btnStatus.setText("Ready"); 
     viewHolder.btnStatus.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Toast.makeText(getContext(),orderList.getOrder_id()+ "+" + orderList.getItem_name() + "+" + position,Toast.LENGTH_SHORT).show(); 
       ad.show(); 
      } 
     }); 


     return convertView; 
    } 


} 

注: 我在builder.setPositiveButton設置Toast消息一樣Button.onClickListener來檢查值的變化,是它確實發生了改變。需要一些幫助和指導,謝謝。

回答

1

這裏的問題是,你爲每個視圖創建AlertDialog甚至到最後一個視圖(最後一個項目),這就是爲什麼你得到的位置是你的項目列表的最後一個索引。嘗試如下所示,這將只在您從其中一個視圖點擊按鈕時創建對話框。

public class myOrderAdapter extends ArrayAdapter<myOrder> { 

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

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

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    final myOrder orderList = getItem(position); 

    ViewHolder viewHolder; 
    viewHolder = new ViewHolder(); 

    if(convertView == null){ 

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

     viewHolder.tableNum = (TextView)convertView.findViewById(R.id.tableNum); 
     viewHolder.itemName = (TextView)convertView.findViewById(R.id.itemName); 
     viewHolder.custName = (TextView)convertView.findViewById(R.id.custName); 
     viewHolder.itemQuantity = (TextView)convertView.findViewById(R.id.itemQuantity); 
     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.custName.setText("Customer Name: " + orderList.getCust_name()); 
    viewHolder.itemQuantity.setText("QTY: " + orderList.getQuantity()); 


    viewHolder.btnStatus.setText("Ready"); 
    viewHolder.btnStatus.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(getContext(),orderList.getOrder_id()+ "+" + orderList.getItem_name() + "+" + position,Toast.LENGTH_SHORT).show(); 
      createDialog(position); 
     } 
    }); 


    return convertView; 
} 

private void createDialog(final int position) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); 
    builder.setTitle("Confirmation " + position); 
    builder.setIcon(R.drawable.pencil); 
    builder.setMessage("Is this Ready to Serve? " + position); 


    builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialogInterface, int i) { 
      Toast.makeText(getContext(),orderList.getOrder_id()+ "+" + orderList.getItem_name() + "+" + position, Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    builder.setNegativeButton("No", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialogInterface, int i) { 
      dialogInterface.dismiss(); 
     } 
    }); 

    builder.create().show(); 
} 
} 
+0

不要忘了標記答案爲接受,如果它可以幫助你 –