2015-12-29 26 views
2

我寫了一個關於購物的簡單測試代碼。就像在圖片中。 add from right to left如何在Android中定製適配器之間進行正確的交互?

很簡單。 ListViews顯示'Item's。 '項目'只有名字和數量。在右側,我改變計數並將物品添加到左側的購物車。

重點是在這裏,當我更改之前添加的物品數量並再次將物品添加到購物車時,購物車和菜單中的所有物品都會變爲最後一個物品。

拍完第一張照片後,我改變了相同的物品數量並重新添加。所以,購物車中的兩件物品的最後一個計數相同。我無法理解代碼中的錯誤。 Second screenshot after added the same item with different count

在此先感謝。

我找到了關於代碼的東西。所有的ArrayList都像靜態一樣工作。如果我更改添加按鈕的onclick metot菜單爲:

ImageButton ekle = (ImageButton) view.findViewById(R.id.imageButton2); 
ekle.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     //After changing this row, all the ArrayList's (menu and cart) items 
     //in this position is changing to the same number 5. 
     //And I delete the EditText's TextChangeListener, as well. 
     menu.get(position).setCount(5); 
     ((BaseAdapter) context.list1.getAdapter()).notifyDataSetChanged(); 
    } 
}); 

public class Item { 
    private String name; 
    private int count; 

    public Item(String s, int i) { 
     name = s; 
     count = i; 
    } 

    public String getName() {return name;} 
    public int getCount() {return count;} 
    public void setName(String s) {name = s;} 
    public void setCount(int i) {count = i;} 
} 

public class MainActivity extends AppCompatActivity { 
ListView list1; 
ListView list2; 
static ArrayList<Item> menu = new ArrayList<>(); 
static ArrayList<Item> cart = new ArrayList<>(); 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    menu.add(new Item("Item1", 1)); 
    menu.add(new Item("Item2", 1)); 
    menu.add(new Item("Item3", 1)); 
    menu.add(new Item("Item4", 1)); 
    menu.add(new Item("Item5", 1)); 

    list1 = (ListView) findViewById(R.id.list1); 
    list1.setAdapter(new CartAdapter(this, cart)); 
    list2 = (ListView) findViewById(R.id.list2); 
    list2.setAdapter(new MenuAdapter(this, menu)); 
} 
} 

public class CartAdapter extends BaseAdapter { 
MainActivity context; 
ArrayList<Item> cart; 

public CartAdapter(Activity activity, ArrayList<Item> m) { 
    context = (MainActivity) activity; 
    cart = m; 
} 

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

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

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

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view; 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    view = inflater.inflate(R.layout.item_list, null); 

    TextView name = (TextView) view.findViewById(R.id.textView); 
    name.setText(cart.get(position).getName()); 

    EditText count = (EditText) view.findViewById(R.id.editText); 
    count.setText("" + cart.get(position).getCount()); 
    return view; 
} 
} 

public class MenuAdapter extends BaseAdapter { 
MainActivity context; 
ArrayList<Item> menu; 

public MenuAdapter(Activity activity, ArrayList<Item> m) { 
    context = (MainActivity) activity; 
    menu = m; 
} 

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

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

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

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    View view; 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    view = inflater.inflate(R.layout.item_list2, null); 

    ImageButton ekle = (ImageButton) view.findViewById(R.id.imageButton2); 
    ekle.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      MainActivity.cart.add(menu.get(position)); 
      ((BaseAdapter) context.list1.getAdapter()).notifyDataSetChanged(); 
     } 
    }); 

    TextView name = (TextView) view.findViewById(R.id.textView2); 
    name.setText(menu.get(position).getName()); 

    EditText miktar = (EditText) view.findViewById(R.id.editText2); 
    miktar.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      if (count != 0) { 
       int i = Integer.parseInt(s.toString()); 
       Item item = menu.get(position); 
       item.setCount(i); 
       MainActivity.menu.set(position, item); 

       CharSequence text = menu.get(position).getName() +" : "+ menu.get(position).getCount(); 
       int duration = Toast.LENGTH_SHORT; 
       Toast toast = Toast.makeText(context, text, duration); 
       toast.show(); 
      } 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 

     } 
    }); 
    return view; 
} 

@Override 
public void notifyDataSetChanged() { 
    super.notifyDataSetChanged(); 
} 
} 

回答

0

我找到了問題的原因。這兩個ArrayLists的行爲像靜態(但他們不是!)。所以我改變了Item類的decleration,最後算了一下。就這樣,問題就解決了。

public class Item 
{ 
private String name; 
private final int count; 

public Item(String s, int i) { 
    name = s; 
    count = i; 
} 

public String getName() {return name;} 
public int getCount() {return count;} 
public void setName(String s) {name = s;} 
} 
相關問題