2012-09-28 15 views
15

私はカスタムListViewの電話連絡先をロードしています。各行はCheckedTextViewと別のTextViewを含むチェック可能なLinearLayoutです。getView内のCheckedTextViewをチェック/チェック解除できません

私はリストビューにカスタムArrayAdapterを与えています。私の問題は、getView()内のCheckedTextViewsを制御できないことです。例えば、私は、リストビューをスクロールするたびに、すべてのテキストビューをチェックすることになっています

public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     if(row == null){    
      row = inflater.inflate(layout, parent, false); 
     } 

     CheckedTextView checkedTextView = (CheckedTextView) row.findViewById(R.id.checkedTextView); 
     checkedTextView.setText("A"); 
     checkedTextView.setChecked(true); 
     return row; 
    } 

次試みるが、それは起こっていないとき。誰も私にそれをする方法を教えてもらえますか?

EDIT:それは(getViewメソッドの内部でそれを確認することが重要です)、私はちょうどsetListAdapter()

EDIT2後にすべてをチェックすることはできません。これは、各行

<?xml version="1.0" encoding="utf-8"?> 
<com.example.multiplecontacts.CheckableLinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <CheckedTextView 
     android:id="@+id/checkedTextView" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:checkMark="?android:attr/listChoiceIndicatorMultiple" 
     android:paddingBottom="0dp" 
     android:text="CheckedTextView" 
     android:textAppearance="?android:attr/textAppearanceLarge" /> 

    <TextView 
     android:id="@+id/subTextView" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Small Text" 
     android:paddingTop="0dp" 
     android:textAppearance="?android:attr/textAppearanceSmall" /> 

</com.example.multiplecontacts.CheckableLinearLayout> 
の見解を示したXMLファイルです

CheckableLinearLayoutは、LinearLayoutを拡張し、前述のCheckableを実装するカスタムレイアウトです。そして、私はそれを取ったhere

+0

アダプタからそれを行うには

、活動から

public View getView(int position, View convertView, ViewGroup parent) { if (//logic) { ((ListView) parent).setItemChecked(position, true); } } 

/断片は、デフォルトでチェックされます。実際には上記のコードは私の実際のコードではなく、私の問題を示す単なるサンプルです。私が必要とするのは、getView()内のCheckedTextViewを切り替えることです。 –

+0

xmlを投稿してください。 –

+0

'checkbox'でレイアウトを取得しましたが、' checkbox'を押してもチェックされません。 –

答えて

26

CheckedTextViewのcheckMarkプロパティをレイアウトxmlに設定しましたか?例えば

は:android:checkMark="?android:attr/listChoiceIndicatorMultiple

CheckedTextViewは、テキストとだけチェックボックスではありません。 ListViewコントロールのために設定する必要がありますsetChoiceMode

(それがリストビューのために設計されて以来、したがって、それは国家のListViewのsetOnItemClickListenerによって制御されている必要があります)また、CheckedTextViewは、いくつかの操作なしでフォーカス可能、またはクリック可能ではないことに注意しなければならない

。 アダプタのgetView内部の行のチェックは、 listView.setItemChecked(position, value)

+0

でした。そして、私が自分で項目を押すと、チェックされている/チェックされていません。それは、そのように動作するgetView()の内部にあります。 –

+0

したがって、setOnItemClickListenerでのみ制御できますか?それを外にトグルする方法はありませんか? –

+0

このコードはどこに書き込まれるべきですか?私は、onClickイベントが解放されたときではなく、checkedTextViewを自動的に切り替えることを試みています。私はすでにonListItemClickを実装しており、うまくいきます。 –

1

となります。これまでgetview()メソッドを呼び出すたびに、スクロールリストをスクロールしていました。リストボックスにチェックボックスやエディットボックスがあれば、それを再初期化します。

私の考えは、チェックボックスの状態(チェックされているかチェックされていない)を保存することです。だからここでArrayListを最初に使用しました。私はそれを実際のステータスを格納するために使用されたクリックイベントで偽の値で埋めました。

class MyAdapter extends BaseAdapter implements OnClickListener { 

    private ArrayList<Boolean> checks=new ArrayList<Boolean>();//Boolean type array to manage check box 

    private static LayoutInflater inflater=null; 

    public MyAdapter(Context context, ArrayList<HashMap<String, String>> d) 
    { 
       inflater =  (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     //fill with false values 
    for (int i = 0; i < d.size(); i++) 
    { 
      checks.add(i, false); 
    } 
    } 

    public int getCount() 
    { 
     return data.size(); 
    } 

    public Object getItem(int position) 
    { 
     return position; 
    } 

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




     public View getView(int position, View convertView, ViewGroup parent) 
     { 

     View vi=convertView; 

     if(convertView==null) 

      vi = inflater.inflate(R.layout.<your layout>, null); 

      //Checkbox is of button type----android:button="@drawable/btn_check" 
      //make a selector xml for checkbox  

      checkBox=(CheckBox)vi.findViewById(R.id.check_box); 


      checkBox.setTag(Integer.valueOf(position)); 
      checkBox.setOnClickListener(this); 
      checkBox.setChecked(checks.get(position)); 


     return vi; 
    } 

     @Override 
     public void onClick(View v) 
     { 
      int viewId=v.getId(); 
      if(viewId== R.id.check_box) 
      { 
      Integer index = (Integer)v.getTag(); 
      boolean state = checks.get(index.intValue()); 
      checks.set(index.intValue(), !state); 

      } 
     } 
    } 

更新:解決策2:あなたのViewHolderクラスにブール変数を入れることができます。このブール変数は、選択された項目を定義するために使用されます。

希望すると、これが役立ちます。

+0

checkBox.setChecked(checks.get(position));あなたと一緒に働いているのですか? CheckedTextView型のcheckBoxまたはチェックボックスですか? –

+0

@IslamHassanはい私の側で働いています。ここで私のチェックボックスはボタンタイプです。 –

1

@ Pier-Luc Gendreauと@foxは解答では答えているが解答には言及していないので、代わりに回答を投稿する。

@AlexOrlovに記載されているように、CheckedTextViewは、何も操作せずにフォーカス可能でもクリック可能でもありません。だからあなたがしなければならないことは、ListViewを使ってアイテムチェックを設定することです。あなたはそれをアダプタ自体から、またはListViewを持っているアクティビティ/フラグメントから行うことができます。私はそれを必要としない

if (//logic) { 
listView.setItemChecked(position, true); 
} 
関連する問題