2017-04-08 9 views
1

Ich habe eine Listenansicht, die Essensbestellungen für ein bestimmtes Restaurant anzeigt. Wenn der Benutzer auf eines der Listenansichtselemente klickt, sollte ein Toast auf die Position des angeklickten Elements und auch auf die Bestell-ID des Lebensmittelauftrags angezeigt werden. Aus irgendeinem Grund wird die falsche Position angezeigt.Merkwürdiges Verhalten der Listenansicht position onlicklistener

PendingOrders.java. Die Daten werden geladen von Feuerbasis

public class PendingOrders extends AppCompatActivity { 

private DatabaseReference mDatabase; 
ArrayList<OrderDetails> activeorders = new ArrayList<OrderDetails>(); 
private OrdersAdapter adapter; 
ListView listview; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_pending_orders); 
    listview = (ListView)findViewById(R.id.pendinglistview); 
    adapter = new OrdersAdapter(this,activeorders); 
    listview.setAdapter(adapter); 


    ValueEventListener listen = new ValueEventListener() { 

     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      OrderDetails order = dataSnapshot.getValue(OrderDetails.class); 
      String str = order.UserId; 

      if (str.equals("abc")) { 
       boolean add = true; 
       for (int i = 0; i < activeorders.size(); i++) { 
        String checking = activeorders.get(i).OrderId; 
        if (checking.equals(order.OrderId)) { 
         add = false; 
        } 
       } 

       if (add = true) { 
        activeorders.add(order); 
        ((OrdersAdapter) listview.getAdapter()).notifyDataSetChanged(); 
       } 

      } 
     } 
     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 

    }; 



    for (int i=1; i<=4;i++) { 
     mDatabase = FirebaseDatabase.getInstance().getReference().child("Active Orders") 
       .child(Integer.toString(i)); 
     mDatabase.addValueEventListener(listen); 
    } 



} 

}

OrdersAdapter.java

public class OrdersAdapter extends BaseAdapter { 

Context context; 
ArrayList<OrderDetails> activeorders; 
Button confirmationbutton; 

public OrdersAdapter(Context context, ArrayList<OrderDetails> activeorders){ 
    this.context = context; 
    this.activeorders = activeorders; 
} 

@Override 
public int getCount() { 
    return activeorders.size() ; 
} 

@Override 
public Object getItem(int position) { 
    return activeorders.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

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

    ViewHolder viewHolder = null; 

    if (convertView == null) { 

     LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 

     viewHolder = new ViewHolder(); 

     convertView = layoutInflater.inflate(R.layout.orderlistview, null); 

     viewHolder.mdtitle = (TextView) convertView.findViewById(R.id.mdtitle); 
     confirmationbutton = (Button) convertView.findViewById(R.id.confirmationbutton); 
     confirmationbutton.setTag(position); 
     viewHolder.switchbutton = (MultiStateToggleButton) convertView.findViewById(R.id.mstb_multi_id); 
     viewHolder.switchbutton.setElements(R.array.planets_array,0); 
     Typeface font = Typeface.createFromAsset(context.getAssets(), "fonts/Lato-Semibold.ttf"); 

     viewHolder.mdtitle.setTypeface(font); 

     convertView.setTag(viewHolder); 


    } else { 

     viewHolder = (ViewHolder) convertView.getTag(); 


    } 

    confirmationbutton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Integer pos = (Integer)v.getTag(); 
      OrderDetails orders = (OrderDetails)getItem(pos); 
      String orderingid = orders.OrderId; 
      Toast.makeText(context, "Position :"+ Integer.toString(pos)+" orderid : "+orderingid, 
        Toast.LENGTH_SHORT).show(); 
      DatabaseReference mDatabase; 
      mDatabase = FirebaseDatabase.getInstance().getReference(); 
      mDatabase.child("Active Orders").child(orderingid).child("Status").setValue("Cooking"); 

      FrameLayout vwParentRow = (FrameLayout)v.getParent(); 
      Button btnChild = (Button)vwParentRow.getChildAt(0); 
      MultiStateToggleButton btnchild2 = (MultiStateToggleButton)vwParentRow.getChildAt(1); 
      btnChild.setVisibility(View.INVISIBLE); 
      btnchild2.setVisibility(View.VISIBLE); 
      notifyDataSetChanged(); 
     } 
    }); 


    OrderDetails orders = (OrderDetails)getItem(position); 
    viewHolder.mdtitle.setText(orders.foodname); 

    return convertView; 
} 

private class ViewHolder{ 
    TextView mdtitle; 
    Button confirmationbutton; 
    MultiStateToggleButton switchbutton; 

} 

}

Screenshot of listview

Erwartete Ausgabe:

Klicken auf die Taste der Pizza: Position 0 orderid 3

von soupp Anklicken der Schaltfläche: Position 1 orderid 4

Stromausgang:

Anklicken der Schaltfläche Pizza: Position 0 orderid 3

Klicken auf Schaltfläche von soupp: Position 0 orderid 3

Dies ist, wenn ich auf das Laden der Daten i warten n und klicken Sie sofort auf die Schaltflächen. Ich habe festgestellt, dass, wenn ich auf das Laden der Daten warte, dann die Zurück-Taste drücken und wieder in die Aktivität zurückkehren, dann wird die Ausgabe korrekt sein. Was mache ich falsch?

Antwort

0

Ihre OnClickListener sollte aus der Seite von Menge und bekommen von ViewHolder Muster in getView

Warum seltsam?

Ihre Schaltfläche klicken Listener werden nur in der 0. Position gebunden, wenn convertView null sein wird. nach onwords convertView wird gefüllt und Listener würde nicht für diese Position wie 1., 2. usw. angefügt.

siehe getView aktualisiert

public View getView(int position, View convertView, final ViewGroup parent) { 
    ViewHolder viewHolder = null; 
    if (convertView == null) {  
     LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     viewHolder = new ViewHolder();  
     convertView = layoutInflater.inflate(R.layout.orderlistview, null); 
     confirmationbutton = (Button) convertView.findViewById(R.id.confirmationbutton); 
     confirmationbutton.setTag(position); 

     convertView.setTag(viewHolder); 

    } else { 

     viewHolder = (ViewHolder) convertView.getTag(); 
    } 

    final int pos = position; 
    confirmationbutton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      OrderDetails orders = (OrderDetails)getItem(pos); 
      String orderingid = orders.OrderId; 
      Toast.makeText(context, "Position :"+ Integer.toString(pos)+" orderid : "+orderingid, 
        Toast.LENGTH_SHORT).show(); 
      notifyDataSetChanged(); 
      } 
    }); 

    OrderDetails orders = (OrderDetails)getItem(pos); 
    viewHolder.mdtitle.setText(orders.foodname); 

    return convertView; 
} 
+0

Haben Sie Ihr Problem gelöst? –

+0

Ich habe versucht, den Codeblock nach Ihrem Vorschlag zu verschieben, aber immer noch unter dem gleichen Problem leiden. – ko5win

+0

posted den ganzen Adaptercode – ko5win

0

bewegen Versuchen Sie setOnClickListener aus dem if(convertview == null) statment.