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;
}
}
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?
Haben Sie Ihr Problem gelöst? –
Ich habe versucht, den Codeblock nach Ihrem Vorschlag zu verschieben, aber immer noch unter dem gleichen Problem leiden. – ko5win
posted den ganzen Adaptercode – ko5win