カスタム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を実装するカスタムレイアウトです。そして私はそれを ここ から取った
レイアウトxmlでCheckedTextViewのcheckMarkプロパティを設定しましたか?
例:_Android:checkMark="?android:attr/listChoiceIndicatorMultiple
_
CheckedTextViewは、テキストを含む単なるチェックボックスではありません。また、CheckedTextViewはフォーカスできないか、操作なしではクリックできないことに注意する必要があります(ListView用に設計されているため、その状態はListViewのsetOnItemClickListener
によって制御する必要があるため)
setChoiceMode
をListViewに設定する必要があります。また、アダプタのgetView内の行のチェックは、listView.setItemChecked(position, value)
を介して実行する必要があります。
@ 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);
}
リストをスクロールするたびに、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クラスにブール変数を配置できます。このブール変数は、アイテムが選択されているかどうかを定義するために使用されます。
これがお役に立てば幸いです。