2015-09-18 11 views
5

私はAndroid ListViewを持っています。これには、クリックするとチェックする必要があるボタンが1つあります。私は、「チェックボックス」をクリックすると、あなたはおそらく、私は緑の初期の背景を変更しています見ることができるように、これはちょうどテストである(背景が赤にする必要があるAndroidリストで表示再描画しない

public View getView(final int position, View convertView, ViewGroup parent) { 
    final ViewHolder holder; 

    LayoutInflater inflater = this._context.getLayoutInflater(); 

    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.checkbox_cell, null); 
     holder = new ViewHolder(); 
     holder.checkbox = (CheckBox) convertView.findViewById(R.id.button); 
     holder.textView = (TextView) convertView.findViewById(R.id.textView); 
     convertView.setTag(holder); 

    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 


    if(holder.checkbox.isChecked()) { 
     convertView.setBackgroundColor(Color.RED); 
     holder.textView.setBackgroundColor(Color.RED); 
     convertView.invalidate(); 
    } else { 
     convertView.setBackgroundColor(Color.GREEN); 
    } 

    holder.checkbox.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 

      Arrays.sort(_context.checkBoxIds); 
      int index = Arrays.binarySearch(_context.checkBoxIds, position); 

      if (((CheckBox) v).isChecked()) { 
       holder.textView.setPaintFlags(holder.textView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 

      } else { 
       holder.textView.setPaintFlags(holder.textView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG)); 
      } 
      holder.textView.setBackgroundColor(Color.RED); 
      notifyDataSetChanged(); 

     } 
    }); 

    return convertView; 
} 

:クリックイベントが動作しているようですUIが更新されるかどうかを確認してください)。私はonClickのビューを更新しようとしましたが、それも動作していません。 onClickの後にnotifyDataSetChanged()と呼んで、私がリフレッシュするときにUIが変化するかどうかを確認します。 holder.checkbox.isChecked()は真実だと思われますが、背景を赤に設定するとUIは更新されません。誰がここで間違っているか知っていますか?私は現時点では無責任です。

+0

あなたのコード内の@Override注釈がありますし、あなたは自分のonClickListenerのために投稿することを忘れていますか? – Opiatefuchs

+0

ああ、それを忘れてしまった。上書きがあります:) –

+0

@LeonBoon:[notifyDataSetChanged()](http://stackoverflow.com/a/12229903/1920735)、それは自分自身をredawときに、それが新鮮なホルダーを参照すると、ビューを再描画するリストビューを要求されます.checkbox.isChecked()。これはデフォルトでは間違い(推測)なので、赤色の背景色は表示されません。 – avinash

答えて

2

あなたのデータ表現に基づいてビューを更新する必要があります。ただし、以前に設定されていないチェックボックスのビューステートに基づいてビューを更新しています。

は、だから、最初の位置にし、使用後に関連したデータの一部に基づいてチェックボックスを更新する必要があり、それをさらに

1
あなたは、チェックボックスをクリックを聞いて、チェックボックスにsetTag()を使用して、アダプタ内部インターフェイスを定義することができます

とそのインタフェースを実装あなたの定義を活動や断片の中に定義することができます。

1

あなたのコードをデバッグする場合、私はif(holder.checkbox.isChecked()) {この行は常にfalseを返すと思います。あなたがそれをクリックすると、しかし、あなたの上書き後、チェック状態を切り替えるべきであるCheckBoxのデフォルトのクリックイベントをオーバーライドしているので、つまり、あなたは、バックグラウンドでもREDに変更することはできません理由です、チェック状態を切り替えるために無視しましたnotifyDatasetChangedを発行した後。

したがっての最初の行にholder.checkbox.setChecked(!checkbox.isChecked());を追加して、役立つかどうか確認してください。

1

アンドロイド:クリッカブル=「true」を使用すると、アダプタのいくつかの操作を行い、これまであなたはこれを更新する必要がある場合、あなたは、あなたのコードにしてみてくださいXMLでこのツアーのチェックボックスを追加してください。

1

まず第一には、リスト上の項目がチェックされている覚えておく必要がある、とされていません。これにはSparseBooleanArrayを使用できます。

はその後getViewに、あなたは適切にチェックが入っていますかどうかに基づいてビューを設定する必要があります。

最後に誰かがチェックボックスをクリックするたびに配列を更新する必要があります。私は、チェックボックスにonClickイベントはあなたに古い新しいを与えるかどうか覚えていませんので、私は(!)で1行をマークし

public class MyAdapter extends BaseAdapter { 

private SparseBooleanArray checkedItems = new SparseBooleanArray(); 

    public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 

     LayoutInflater inflater = this._context.getLayoutInflater(); 

     if (convertView == null) { 
      // ... 
     } else { 
      // ... 
     } 

     holder.checkbox.setOnClickListener(null); // You may be reusing views, so avoid firing previous listener set 

     holder.checkbox.setChecked(checkedItems.get(position, false)); // Set checked value for the checkbox based on your checked items array 

     if(holder.checkbox.isChecked()) { 
      // Do your stuff 
     } else { 
      // Do your stuff 
     } 

     holder.checkbox.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 

       checkedItems.put(position, ((CheckBox) v).isChecked()); // (!) 
       // do stuff 
      } 
     }); 

     return convertView; 
    } 
} 

は、状態を確認 - あなたは適切な否定を追加する必要があります。

0

シンプル! notifyDataSetChanged();の後に同じコントロールが見つからないのは、この関数が呼び出し元のビューを更新するためです。

public View getView(final int position, View convertView, ViewGroup parent) { 
return convertView; 
} 

このようにすべてのビューを更新すると、同じ状態のチェックボックスが表示されません。

あなたは、任意のバインダークラスを使用してデータ一環として、状態を確認見つける必要があります。

あなたがクリックしたとき、あなたはデータの状態を確認します。

List<CheckState> checkState=new ArrayList<CheckState>();// as an instance 


holder.checkbox.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 

      if (((CheckBox) v).isChecked()) { 

checkState.add(new CheckState(true); 

     } else{ 

      checkState.add(position,false); 

     } 
    }); 





if(checkState.get(position).isChecked()) 
    { 
     convertView.setBackgroundColor(Color.RED); 
     holder.textView.setBackgroundColor(Color.RED); 
     convertView.invalidate(); 
    } else { 
     convertView.setBackgroundColor(Color.GREEN); 
    } 

例: - 私はそれはあなたに役立つと思い

public class CheckState { 

    boolean isChecked; 

    public CheckState(boolean isChecked) { 

     this.isChecked = isChecked; 
    } 

    public boolean isChecked() { 
     return isChecked; 
    } 



} 

内部クラスを作成します!

関連する問題