2017-04-08 75 views
1

我有一个listview显示某个餐厅的食品订单。当用户点击其中一个列表视图项目时,它应该显示所点击项目位置的烘烤以及食品订单的订单标识。出于某种原因显示错误的位置。ListView位置的奇怪行为onlicklistener

PendingOrders.java。数据从火力

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

预期输出:

比萨饼的点击按钮:位置0的OrderID 3

点击soupp的按钮:位置1的OrderID 4

电流输出:比萨饼的

点击按钮:位置0的OrderID 3

soupp点击按钮:位置0 orderid 3

这是如果我等待数据被加载我n并立即点击按钮。我注意到,如果我等待数据加载,然后按下后退按钮并再次返回活动,那么输出将是正确的。我在做什么错误?

回答

0

OnClickListener应设置出侧和getView

得到ViewHolder模式为什么奇怪?

你点击链接监听器只将在第0位连接时 convertView将。在onwords convertView将被填充和 听众将不会像第1,第2等位置附加。

看到更新getView

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

您是否解决了您的问题? –

+0

我试图根据你的建议移动代码块,但仍然遭受同样的问题。 – ko5win

+0

发布了整个适配器代码 – ko5win

0

请尝试移动setOnClickListenerif(convertview == null) statment的。