2017-05-26 14 views
0

私は購入するアイテムを選択できるこのリストビューを持っています。アイテムをクリックすると、要素のグループが表示されます。 (チェックボックス、2つのボタン、およびテキストビュー)購入する製品の数量を選択できます。リストビュー上の隠れ要素のグループが他の行にランダムに表示されないようにするにはどうすればよいですか?

このグループの要素はレイアウト内に表示されません。 VIEW.GONEからの要素の変化のこのグループの視認性が

enter image description here

問題はボタンが他の行にランダムに表示されることであるVIEW.VISIBLEします。 たとえば、THIN BEERをクリックすると、ビューの要素のグループが表示されますが、アプリケーションを下にスクロールすると、HAMBURGER行などの要素のグループも表示されます。

enter image description here

そして、私はTextViewのの1に値を変更すると、他の要素に増加。

enter image description here

enter image description here

public class ProductAdapter extends ArrayAdapter<Product> { 
     ArrayList<Boolean> positionArray; 
     public ProductAdapter(Context context, ArrayList<Product> products){ 
      super(context,0,products); 
      positionArray = new ArrayList<Boolean>(products.size()); 
      for(int i =0;i<products.size();i++){ 
       positionArray.add(false); 
      } 
     } 

     public static class ViewHolder{ 
      TextView tv_price,tv_prodName, tv_details, tv_location; 
      ImageView imgView_productImage; 
      CheckBox checkBox; 
      Button bntUp,btnDown; 
     } 
     //When a listview recycles views , it recycles its present state as well as listeners attached to it.if the checkbox was checked and has a 
     // onCheckedChangeListener set, both will remain a part of recycled view based on position. 
     // So it is our responsibility to reset all states and remove previous listeners. 
     @NonNull 
     @Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
      ViewHolder viewHolder; 
      Product product = getItem(position); 
      if(convertView==null){ 
       convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_product_item,parent, false); 
       viewHolder = new ViewHolder(); 

       viewHolder.imgView_productImage = (ImageView)convertView.findViewById(R.id.list_item_imgView_productImage); 
       viewHolder.tv_price = (TextView)convertView.findViewById(R.id.listItem_tv_price); 
       viewHolder.tv_prodName = (TextView)convertView.findViewById(R.id.listItem_tv_productName); 
       viewHolder.tv_location = (TextView)convertView.findViewById(R.id.listItem_tv_location); 
       viewHolder.tv_details = (TextView)convertView.findViewById(R.id.listItem_tv_productDetail); 
       viewHolder.checkBox = (CheckBox)convertView.findViewById(R.id.listProd_checkbox); 
       viewHolder.bntUp = (Button)convertView.findViewById(R.id.listProd_up); 
       viewHolder.btnDown = (Button)convertView.findViewById(R.id.listProd_down); 

       convertView.setTag(viewHolder); 



      }else{ 
       viewHolder = (ViewHolder)convertView.getTag(); 
       viewHolder.checkBox.setOnCheckedChangeListener(null); // 
      } 
      viewHolder.tv_price.setText("$" + String.valueOf(product.getPrice())); 
      viewHolder.tv_prodName.setText(product.getProductName()); 
      viewHolder.tv_location.setText(product.getLocation()); 
      viewHolder.tv_details.setText(product.getProductDetail()); 
      viewHolder.imgView_productImage.setImageBitmap(MifareUtilities.getDecodeImage(product.getProductImage())); 
      viewHolder.checkBox.setChecked(positionArray.get(position)); 
      viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        if(isChecked){ 
         positionArray.set(position,true); 
        }else { 
         positionArray.set(position,false); 
        } 
       } 
      }); 

      return convertView; 
     } 


    `} 

そして、これはあなたが作成するたび私が正しくあなたを理解している場合、私はListViewコントロール

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    productsList = new HashMap<>(); 
    final View viewroot = inflater.inflate(R.layout.fragment_payment, container, false); 
    final ArrayList<Product> products = (ArrayList<Product>)new ProductController(new ProductFromString()).getProducts(); 
    final ListView listView = (ListView)viewroot.findViewById(R.id.fragPayment_listview); 
    ProductAdapter productAdapter = new ProductAdapter(getActivity(),products); 
    listView.setAdapter(productAdapter); 
    listView.setLongClickable(true); 


    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, final int position, long id) { 
      final int positionf = position; 
      final CheckBox checkBox = (CheckBox)view.findViewById(R.id.listProd_checkbox); 
      checkBox.setVisibility(View.VISIBLE); 
      checkBox.setChecked(!checkBox.isChecked()); 
      getActivity().runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        if(!checkBox.isChecked()){ 
         productsList.remove(String.valueOf(position)); 
        }else { 
         Product product = (Product) listView.getAdapter().getItem(positionf); 
         productsList.put(String.valueOf(position),product); 
        } 
       } 
      }); 
      final Button btnUp = (Button)view.findViewById(R.id.listProd_up); 
      final Button btnDown = (Button)view.findViewById(R.id.listProd_down); 
      final TextView quantity = (TextView)view.findViewById(R.id.listItem_quantity); 
      btnUp.setTag(position); 
      btnDown.setTag(position); 
      btnDown.setVisibility(View.VISIBLE); 
      btnUp.setVisibility(View.VISIBLE); 
      quantity.setVisibility(View.VISIBLE); 
      btnDown.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //String q = quantity.getText().toString(); 
        int quan = Integer.parseInt(quantity.getText().toString()); 
        //int btnPosition = (Integer)v.getTag(); 

        if(quan!=1){ 
         quan --; 
         quantity.setText(String.valueOf(quan)); 
         updateProductQuantity(listView,(Integer)v.getTag(),Integer.parseInt(quantity.getText().toString())); 
        }else { //if the quantity is 0 it will hide the buttons and uncheck 
         btnDown.setVisibility(View.GONE); 
         btnUp.setVisibility(View.GONE); 
         checkBox.setChecked(false); 
         quantity.setVisibility(View.GONE); 
         checkBox.setVisibility(View.GONE); 
         //remove product from list 
         productsList.remove(String.valueOf((Integer)v.getTag())); 

        } 
       } 
      }); 
      btnUp.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        int quan = Integer.parseInt(quantity.getText().toString()); 
        quan++; 
        quantity.setText(String.valueOf(quan)); 
        // updateProductQuantity(listView,(Integer)v.getTag(),Integer.parseInt(quantity.getText().toString())); 
       } 
      }); 



     } 
    }); 
    listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 

     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 
      final Product product = (Product) listView.getAdapter().getItem(position); 
      //dlgShowConfig(product); 
      Intent intentActivityPayment = new Intent(getActivity(), ActivityPayment.class); 
      intentActivityPayment.putExtra("productObject",product); 
      startActivity(intentActivityPayment); 
      return true; //evitara que se ejecute el onitemclicklistener cuando ejecutes el onitemlongclicklisstener 
     } 
    }); 


    return viewroot; 
    } 
+0

ここで、グループ項目の可視性を処理しますか? – Pavan

+0

アダプタのgetviewメソッドでそれを処理する必要があります。あなたのアダプタデータを使用して状態を維持することができます – Pavan

+0

レイアウトlist_product_item.xmlの可視性を処理します。また、onCreateViewメソッドのフラグメントにもあります。 – mavi

答えて

1

を表示私の断片上にあるコードであり、新しいListViewアイテムをすべてのボタンの下にスクロールしてアイテムに表示します。

Logicでは、アイテムが作成されたときに別のボタンを表示しないようにする必要があることを示唆しています。

+0

はい、アダプターに入っている必要があります。ありがとう – mavi

0

あなたが正しいです、ロジックがアダプタにある必要があり、状態を変数に保存する必要があります。 状態を保存するために、私のチェックボックスの状態を保存していました。私の製品モデルにブール変数を追加しました。

ありがとう@PAVANのヘルプ。

public class ProductAdapter extends ArrayAdapter<Product> { 
ArrayList<Boolean> positionArray; 
public ProductAdapter(Context context, ArrayList<Product> products){ 
    super(context,0,products); 
    positionArray = new ArrayList<Boolean>(products.size()); 
    for(int i =0;i<products.size();i++){ 
     positionArray.add(false); 
    } 
} 

public static class ViewHolder{ 
    TextView tv_price,tv_prodName, tv_details, tv_location, quantity; 
    ImageView imgView_productImage; 
    CheckBox checkBox; 
    Button bntUp,btnDown; 
} 
//When a listview recycles views , it recycles its present state as well as listeners attached to it.if the checkbox was checked and has a 
// onCheckedChangeListener set, both will remain a part of recycled view based on position. 
// So it is our responsibility to reset all states and remove previous listeners. 
@NonNull 
@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    final ViewHolder viewHolder; 
    Product product = getItem(position); 
    if(convertView==null){ 
     convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_product_item,parent, false); 
     viewHolder = new ViewHolder(); 

     viewHolder.imgView_productImage = (ImageView)convertView.findViewById(R.id.list_item_imgView_productImage); 
     viewHolder.tv_price = (TextView)convertView.findViewById(R.id.listItem_tv_price); 
     viewHolder.tv_prodName = (TextView)convertView.findViewById(R.id.listItem_tv_productName); 
     viewHolder.tv_location = (TextView)convertView.findViewById(R.id.listItem_tv_location); 
     viewHolder.tv_details = (TextView)convertView.findViewById(R.id.listItem_tv_productDetail); 
     viewHolder.checkBox = (CheckBox)convertView.findViewById(R.id.listProd_checkbox); 
     viewHolder.bntUp = (Button)convertView.findViewById(R.id.listProd_up); 
     viewHolder.btnDown = (Button)convertView.findViewById(R.id.listProd_down); 
     viewHolder.quantity = (TextView)convertView.findViewById(R.id.listItem_quantity); 

     convertView.setTag(viewHolder); 



    }else{ 
     viewHolder = (ViewHolder)convertView.getTag(); 
     viewHolder.checkBox.setOnCheckedChangeListener(null); // 
    } 
    viewHolder.tv_price.setText("$" + String.valueOf(product.getPrice())); 
    viewHolder.tv_prodName.setText(product.getProductName()); 
    viewHolder.tv_location.setText(product.getLocation()); 
    viewHolder.tv_details.setText(product.getProductDetail()); 
    viewHolder.imgView_productImage.setImageBitmap(MifareUtilities.getDecodeImage(product.getProductImage())); 
    viewHolder.checkBox.setChecked(positionArray.get(position)); 
    int visible = positionArray.get(position) == true ? View.VISIBLE : View.GONE; 
    viewHolder.checkBox.setVisibility(visible); 
    viewHolder.bntUp.setVisibility(visible); 
    viewHolder.btnDown.setVisibility(visible); 
    viewHolder.quantity.setVisibility(visible); 
    viewHolder.quantity.setText(String.valueOf(product.getQuantity())); 
    viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if(isChecked){ 
       positionArray.set(position,true); 
       //show buttons 
       changeVisibility(viewHolder,View.VISIBLE); 
      }else { 
       positionArray.set(position,false); 
       changeVisibility(viewHolder,View.GONE); 
      } 
     } 
    }); 

    return convertView; 
} 

public void changeVisibility(ViewHolder viewHolder, int visibility){ 
    viewHolder.bntUp.setVisibility(visibility); 
    viewHolder.btnDown.setVisibility(visibility); 
    viewHolder.quantity.setVisibility(visibility); 
    viewHolder.checkBox.setVisibility(visibility); 
} 
} 
関連する問題