2016-07-21 3 views
1

私はアイテムを保持しているlistViewを持っていて、アイテムの1つが強調表示されています。android adapter listview、行への変更

アイテムをクリックすると、強調表示されたカードが強調表示されなくなり、新しいアイテムがハイライト表示されます。

私がこれまで行ってきたこと。

リストを使用してアダプタを呼び出し、リスト内の項目の1つがdefaultItem(trueまたはfalse)です。

getViewが呼び出されると、if defaultItemがあり、その項目のUIを変更します。また、その項目をcurrentDefaultItemというクラス変数に保存します。

今クリックすると、古い強調表示された項目がfalseになり、クリックされた項目がtrueになるようにリストを変更できます。私はnotifyDataSetChanged()を呼び出します。 しかし、これは動作していないようです。

ショーgetViewの

@Override 
public View getView(final int position, View v, ViewGroup parent) { 
    ViewHolder holder; 
    Card card = getItem(position); 
    if (v == null) { 
     v = mInflater.inflate(R.layout.row_cards, parent, false); 

    holder = new ViewHolder(); 
     holder.tvName = (TextView) v.findViewById(R.id.tvName); 
     holder.tvBrand = (TextView) v.findViewById(R.id.tvBrand); 
    holder.tvLastFour = (TextView) v.findViewById(R.id.tvLastFour); 
    holder.tvCounter = (TextView) v.findViewById(R.id.tvCounter); 
    holder.tvCard = (ImageView) v.findViewById(R.id.tvCard); 
     holder.arrow = (ImageView) v.findViewById(R.id.arrow); 
     holder.tick = (ImageView) v.findViewById(R.id.tick); 

     if (card.getDefaultcard().intValue()==(1)){ 
      holder.tick.setVisibility(View.VISIBLE); 
      positionOfDefault=position; 
     } 


     String brand = card.getBrand(); 
     switch (brand.toLowerCase()){ 
      case "visa": 
       holder.tvCard.setImageResource(R.drawable.visa2); 
       break; 
      case "mastercard": 
       holder.tvCard.setImageResource(R.drawable.mastercardx2); 
       break; 
      case "diners": 
       holder.tvCard.setImageResource(R.drawable.dinersclub2); 
       break; 
      case "amex": 
       holder.tvCard.setImageResource(R.drawable.americanexpress2); 
       break; 
      case "jcb": 
       holder.tvCard.setImageResource(R.drawable.jcg2); 
       break; 
      case "discover": 
       holder.tvCard.setImageResource(R.drawable.discover); 
       break; 
     } 

    holder.b_delete_in_list = (Button) v.findViewById(R.id.b_delete_in_list); 

    holder.b_delete_in_list.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      deleteCard(position); 
     } 
    }); 
     holder.b_set_default = (Button) v.findViewById(R.id.b_set_default); 

     holder.b_set_default.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       updatePaymentMethod(position); 
      } 
     }); 
    // 
    v.setTag(holder); 

    // 
} else { 
    holder = (ViewHolder) v.getTag(); 
} 
    holder.tvName.setText(cardList.get(position).getName().toUpperCase()); 
    holder.tvBrand.setText(cardList.get(position).getBrand().toUpperCase()); 
    holder.tvLastFour.setText(cardList.get(position).getLast_four_digits()); 


    return v; 
} 
+0

貼り付けコードを試してみてください。 –

+0

okay編集済みの質問 –

+0

ここで、currentDefaultItem変数はありますか? –

答えて

1

は、アダプタ内のGetViewメソッドからこの

@Override 
public View getView(final int position, View v, ViewGroup parent) { 
    ViewHolder holder; 
    Card card = getItem(position); 
    if (v == null) 
    { 
     v = mInflater.inflate(R.layout.row_cards, parent, false); 
     holder = new ViewHolder(); 
     holder.tvName = (TextView) v.findViewById(R.id.tvName); 
     holder.tvBrand = (TextView) v.findViewById(R.id.tvBrand); 
     holder.tvLastFour = (TextView) v.findViewById(R.id.tvLastFour); 
     holder.tvCounter = (TextView) v.findViewById(R.id.tvCounter); 
     holder.tvCard = (ImageView) v.findViewById(R.id.tvCard); 
     holder.arrow = (ImageView) v.findViewById(R.id.arrow); 
     holder.tick = (ImageView) v.findViewById(R.id.tick); 

     v.setTag(holder); 
    } else { 
     holder = (ViewHolder) v.getTag(); 
    } 

    if (card.getDefaultcard().intValue()==(1)) 
    { 
      holder.tick.setVisibility(View.VISIBLE); 
      positionOfDefault=position; 
    } 
    String brand = card.getBrand(); 
    switch (brand.toLowerCase()){ 
      case "visa": 
       holder.tvCard.setImageResource(R.drawable.visa2); 
       break; 
      case "mastercard": 
       holder.tvCard.setImageResource(R.drawable.mastercardx2); 
       break; 
      case "diners": 
       holder.tvCard.setImageResource(R.drawable.dinersclub2); 
       break; 
      case "amex": 
       holder.tvCard.setImageResource(R.drawable.americanexpress2); 
       break; 
      case "jcb": 
       holder.tvCard.setImageResource(R.drawable.jcg2); 
       break; 
      case "discover": 
       holder.tvCard.setImageResource(R.drawable.discover); 
       break; 
     } 

    holder.b_delete_in_list = (Button)v.findViewById(R.id.b_delete_in_list); 

    holder.b_delete_in_list.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      deleteCard(position); 
     } 
    }); 
     holder.b_set_default = (Button) v.findViewById(R.id.b_set_default); 

     holder.b_set_default.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       updatePaymentMethod(position); 
      } 
     }); 
    holder.tvName.setText(cardList.get(position).getName().toUpperCase()); 
    holder.tvBrand.setText(cardList.get(position).getBrand().toUpperCase()); 
    holder.tvLastFour.setText(cardList.get(position).getLast_four_digits()); 


    return v; 
} 
1

問題は、あなたのelseステートメントは、ビューを更新していないことです。アダプターを使用すると、画面に収まる最大量の項目がロードされ、ヌルになります。最初のif文は最初のビューがnullのため、ヒットします。一度それらのビューを更新すると、もはやnullではありません。したがって、elseステートメントのViewプロパティを変更する必要があります。管理デフォルトのアイテムです

1

あなたのコード:

if (card.getDefaultcard().intValue()==(1)){ 
     holder.tick.setVisibility(View.VISIBLE); 
     positionOfDefault=position; 
    } 

はないに内の他のでなければならない場合(ビュー== null)のので場合(ビュー== nullの)実行だけのものではコード、したがって、デフォルトを変更すると、コードは決して再び実行されません。

関連する問題