programing2012. 8. 14. 17:36

TestListActivity.java

TestListAdapter mCustomAdapter;

mCustomAdapter = new TestListAdapter(TestNews.this, lDataList, R.layout.test_datalist, from, to);
mLv_TestList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
mLv_TestList.setAdapter(mCustomAdapter);

TestListAdapter.java

public class TestListAdapter extends SimpleAdapter {

	private List<Map<String, String>> mArrayList;
	private int mResource; // Layout ID
	private Context mContext;
	ViewHolder holder;
	ArrayList<Boolean> array;

	public TestListAdapter(Context context, List<Map<String, String>> lDataListFix, int resource, String[] from, int[] to) {
		super(context, lDataListFix, resource, from, to);
		mArrayList = lDataListFix;
		mResource = resource;
		mContext = context;

	}

	@Override
	public int getCount() {
		return mArrayList.size();
	}

	@Override
	public Object getItem(int position) {
		return mArrayList.get(position).get("msg") + "<" + mArrayList.get(position).get("date") + ">";
	}

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

	@Override
	public View getView(final int position, View convertView, ViewGroup parent) {
		if (convertView == null) {
			LayoutInflater vi = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
			convertView = vi.inflate(mResource, null);

			holder = new ViewHolder();
			holder.msg = (TextView) convertView.findViewById(R.id.msg);
			holder.date = (TextView) convertView.findViewById(R.id.date);
			holder.cb_checkbox = (CheckBox) convertView.findViewById(R.id.cb_checkbox);
			convertView.setTag(holder);
		} else
			holder = (ViewHolder) convertView.getTag();

		Map<String, String> iItem = mArrayList.get(position);

		holder.tv_Msg.setText(iItem.get("msg"));
		holder.tv_CreateDate.setText(iItem.get("date"));
		holder.cb_checkbox.setChecked(false);

		holder.cb_checkbox.setChecked(((ListView)parent).isItemChecked(position));
		return convertView;
	}

}

class ViewHolder {
	TextView msg;
	TextView date;
	CheckBox cb_checkbox;
}


여기까지 별반 다르지 않았다. 체크박스 까지는 무난하게 만들지만 리스트가 늘어나면 문제가 생겼다.
체크하지 않았는데도 체크가되거나 스크롤 내리면 체크한 리스트에서 체크가 해제되어 보여졌다.
실제로는 체크가되어있었다.
인터넷에 많이 찾아봤지만 명쾌한 답이잘 없다. 결국 해결한건
holder.cb_checkbox.setChecked(((ListView)parent).isItemChecked(position));
한줄이다.

 TestListActivity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/msg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dip"
            android:layout_marginRight="10dip"
            android:textColor="@color/black"
            android:textSize="17dp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/date"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dip"
            android:layout_marginRight="10dip"
            android:textColor="@color/text3" />
    </LinearLayout>

    <CheckBox
        android:id="@+id/cb_checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp" 
        android:focusable="false"
        android:clickable="false"/>

</LinearLayout>
Posted by 부르마