web-dev-qa-db-ja.com

getView内のCheckedTextViewをチェック/チェック解除できません

カスタムListViewに電話の連絡先を読み込んでいます。各行は、CheckedTextViewと別のTextViewを含むチェック可能なLinearLayoutです。

カスタム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;
    }

リストビューをスクロールするたびにすべてのテキストビューをチェックすることになっていますが、それは起こりません。誰か教えてもらえますか?

編集:getView()内でチェックすることが重要です。setListAdapter()の後ですべてをチェックすることはできません。

EDIT2:これは各行のビューを示すxmlファイルです

<?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>

CheckableLinearLayoutは、LinearLayoutを拡張し、前に述べたようにCheckableを実装するカスタムレイアウトです。そして私はそれを ここ から取った

16
Islam Hassan

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

例:_Android:checkMark="?android:attr/listChoiceIndicatorMultiple_

CheckedTextViewは、テキストを含む単なるチェックボックスではありません。また、CheckedTextViewはフォーカスできないか、操作なしではクリックできないことに注意する必要があります(ListView用に設計されているため、その状態はListViewのsetOnItemClickListenerによって制御する必要があるため)

setChoiceModeをListViewに設定する必要があります。また、アダプタのgetView内の行のチェックは、listView.setItemChecked(position, value)を介して実行する必要があります。

30
Alex Orlov

@ Pier-Luc Gendreauと@foxはコメントで解決策について言及しましたが、回答ではなかったため、彼らに代わって回答を投稿しました。

@AlexOrlovが述べたように、CheckedTextViewはフォーカスできないか、操作なしではクリックできません。したがって、ListViewを使用してアイテムチェックを設定する必要があります。これは、アダプタ自体から、またはListViewがあるアクティビティ/フラグメントから実行できます。

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

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

アクティビティ/フラグメントから

if (//logic) {
listView.setItemChecked(position, true);
}
3
Rohan Kandwal

リストをスクロールするたびに、getview()メソッドを呼び出すたびに。したがって、リストセルにチェックボックスまたは編集ボックスがある場合は、それが再初期化されます。

私の考えは、チェックボックスのステータス(チェックされているかチェックされていないか)を保存することです。したがって、ここでは最初にArrayListを使用してfalse値を入力し、次にクリックイベントで実際のステータスを保存していました。

 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クラスにブール変数を配置できます。このブール変数は、アイテムが選択されているかどうかを定義するために使用されます。

これがお役に立てば幸いです。

1
Akhilesh Mani