2017-02-17 1 views
0

CheckTextViewのチェックボックスの状態を「覚えている」問題があります。 これをクリックすると、状態が変更されますが、異なるCheckBoxで変更されます。CustomAdapter - CheckedTextView

class CustomAdapterSmartwatch extends ArrayAdapter<String> { 


static class ViewHolder { 
    protected CheckedTextView cTextView; 
} 

ViewHolder holder; 


public CustomAdapterSmartwatch(Context context, ArrayList<String> variables) { 
    super(context,R.layout.row_smartwatch_resources,variables); 
} 

@NonNull 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     holder = new ViewHolder(); 
     LayoutInflater smartwatchinflater = LayoutInflater.from(getContext()); 
     convertView = smartwatchinflater.inflate(R.layout.row_smartwatch_resources,parent,false); 
     holder.cTextView = (CheckedTextView) convertView.findViewById(R.id.row_smartwatch_checked); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.cTextView.setText(getItem(position)); 

    holder.cTextView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (holder.cTextView.isChecked()) { 
       holder.cTextView.setChecked(false); 
      } else { 
       holder.cTextView.setChecked(true); 
      } 
     } 
    }); 

    return convertView; 
} 

}

今私は、ホルダーを使用して把握しようとしているが、私はそれがSparseBooleanArrayを使用することが可能だということを聞きました。誰かがそれを動作させる方法を説明することはできますか?

EDIT 1 私は、CustomAdapterによって制御されるListViewを持っています。そのアダプタには1つの項目(CheckedTextView)しか含まれていません。 問題は、スクロールした後、これらのチェックボックスが状態を覚えていないことです。 あなたの答えは説明でわかりましたが、 "CheckedTextView"をクリックすると、チェックボックスの状態は変わりません。あなたは、各CheckTextViewのブールフラグを保持する必要が

EDIT 2

@NonNull 
@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     holder = new ViewHolder(); 
     LayoutInflater smartwatchinflater = LayoutInflater.from(getContext()); 
     convertView = smartwatchinflater.inflate(R.layout.row_smartwatch_resources,parent,false); 
     holder.cTextView = (CheckedTextView) convertView.findViewById(R.id.row_smartwatch_checked); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.cTextView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Log.d("MainActivity","Position = " + position); 
      CheckedTextView checkedText = (CheckedTextView) v; 
      checkedState.put(position, !checkedText.isChecked()); 

      Log.d("MainActivity","State = " + checkedState.get(position)); 

     } 
    }); 

    holder.cTextView.setText(getItem(position)); 
    holder.cTextView.setChecked(checkedState.get(position)); 

    return convertView; 
} 

EDIT 3

class CustomAdapterSmartwatch extends ArrayAdapter<String> { 

public SparseBooleanArray checkedState = new SparseBooleanArray(); 
private CheckedTextView cTextView; 


public CustomAdapterSmartwatch(Context context, ArrayList<String> variables) { 
    super(context,R.layout.row_smartwatch_resources,variables); 
} 

@NonNull 
@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    LayoutInflater smartwatchinflater = LayoutInflater.from(getContext()); 
    convertView = smartwatchinflater.inflate(R.layout.row_smartwatch_resources,parent,false); 
    cTextView = (CheckedTextView) convertView.findViewById(R.id.row_smartwatch_checked); 

    cTextView.setText(getItem(position)); 
    cTextView.setChecked(checkedState.get(position)); 

    cTextView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Log.d("MainActivity","Position = " + position); 
      CheckedTextView checkedText = (CheckedTextView) v; 
      checkedText.toggle(); 

      if (checkedText.isChecked()) 
       checkedState.put(position,true); 
      else 
       checkedState.delete(position); 
      Log.d("MainActivity","State = " + checkedState.get(position)); 

     } 
    }); 
    return convertView; 
} 

}

+0

あなたの編集は、私の答えに対するコメントとして、または新しい質問として、より適切です。 –

答えて

0

。これは配列、List、またはSparseBooleanArrayです。あなたはホルダーのみFR表示される行を引退しているので、ホルダーに入れたくない

class CustomAdapterSmartwatch extends ArrayAdapter<String> { 
    private SparseBooleanArray checkedState = new SparseBooleanArray(); 

    // ... 
} 

:あなたが選択したデータ構造は、あなたのアダプタのフィールドでなければなりません。一方、可視であるかどうかにかかわらず、すべての行についてチェック状態を維持する必要があります。ユーザーがCheckedTextViewをクリックしたときに

は今、あなたは、保存されたチェック状態を設定します。

@NonNull 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // ... 

    holder.cTextView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      CheckedTextView checkedText = (CheckedTextView)v; 
      checkedState.put(position, checkedText.isChecked()); 
     } 
    }); 
} 

そして、あなたはビューを膨らませるか、ホルダーから1を再利用するたびにチェックされた状態を復元:

@NonNull 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // ... 

    holder.cTextView.setText(getItem(position)); 
    holder.cTextView.setChecked(checkedState.get(position)); 

    // ... 
} 
+0

私の編集をチェックしてください(上の回答) – Ace

+0

@Ace現在、私はこのページを読み込むと "トップ"答えです。 SOは投票に基づいて答えを並べ替え、それらをランダム化することに注意してください。 –

+0

私は質問をしたその投稿を意味しました;) – Ace

-1

更新と次のようにあなたのコードを置き換えます

class CustomAdapterSmartwatch extends ArrayAdapter<CustomAdapterSmartwatch.MyPojo> { 

    class MyPojo { 
     boolean checked; 
     String data; 

     public boolean isChecked() { 
      return checked; 
     } 

     public void setChecked(boolean checked) { 
      this.checked = checked; 
     } 

     public String getData() { 
      return data; 
     } 

     public void setData(String data) { 
      this.data = data; 
     } 
    } 

    static class ViewHolder { 
     protected CheckedTextView cTextView; 
    } 

    ViewHolder holder; 


    public CustomAdapterSmartwatch(Context context, ArrayList<MyPojo> variables) { 
     super(context, R.layout.row_smartwatch_resources, variables); 
    } 

    @Nullable 
    @Override 
    public MyPojo getItem(int position) { 
     return super.getItem(position); 
    } 

    @NonNull 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      holder = new ViewHolder(); 
      LayoutInflater smartwatchinflater = LayoutInflater.from(getContext()); 
      convertView = smartwatchinflater.inflate(R.layout.row_smartwatch_resources,parent,false); 
      holder.cTextView = (CheckedTextView) convertView.findViewById(R.id.row_smartwatch_checked); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     final MyPojo item = getItem(position); 

     holder.cTextView.setText(item.getData()); 
     holder.cTextView.setChecked(item.isChecked()); 

     holder.cTextView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       boolean nextStatus = !item.isChecked(); 
       item.setChecked(nextStatus); 
       holder.cTextView.setChecked(nextStatus); 
      } 
     }); 

     return convertView; 
    } 
} 
+0

ArrayAdapter(コンテキスト、int型、ArrayListの) コンストラクタArrayAdapter.ArrayAdapter(コンテキスト、int型、int型)が適用 (引数の不一致; ArrayListのはintに変換することはできません)ではありませんが見つかりませ適しコンストラクタ コンストラクタ しかし、ArrayListの変えられない。 – Ace

+0

コンストラクタを 'CustomAdapterSmartwatch(Context context、ArrayList variables) 'に変更してください。 –

+0

OPのコードを変更して問題を解決する方法を説明してください。 –

-1

あなたは、単純にビューを使用することができますonClick()メソッド自体。

holder.cTextView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if(v instanceOf CheckedTextView) { 
       CheckedTextView c = (CheckedTextView) v; 
       c.setChecked(!c.isChecked()); 
      } 
     } 
    }); 
+0

CheckedTextViewインスタンスに対してのみこのリスナーを設定するため、 'instanceOf'を実行する理由はありません。また、CheckedTextViewは、クリックされると、すでにチェックされた状態を追跡します。これを行うためのコードを書く必要はありません。 –

関連する問題