ListView에서 ImageView와 TextView, CheckedTextView 사용하여 한 Row에 Image와 Text, Checkbox가 표현되는 ItemDeleteList를 만들고 있습니다.
CustomAdapter를 생성하여 현재 리스트 자체는 만들었고 정상동작을 하고 있습니다.
문제는 각 Item에 Click 이벤트 시, 해당 item(row)의 checkbox를 toggle 시키고 싶은데,
구현을 해보았으나 어떤 item을 클릭하던 제일 상위의 item만 checkbox가 toggle되고 있습니다.
해당 소스의 주석 부분에서 어떤 처리가 이뤄져야 할 것 같은데 감도 안오고, 예제도 찾기 힘들고...
부디 해결방법을 아시는 분 답변 부탁드립니다.
혹은 비슷한 유형의 예제라도 제시해주시면 감사하겠습니다.
소스는 다음과 같습니다.
------------deletelistmain.xml---------------
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView
android:id="@+id/delete_list"
android:layout_width="320px"
android:layout_height="400px"
/>
<Button
android:layout_width="320px"
android:layout_height="40px"
android:id="@+id/button3"
android:text="@string/button2"
android:layout_gravity="center_horizontal">
</Button>
<TextView
android:id="@+id/android:empty"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="tets"
/>
</LinearLayout>
------------deletelistrow.xml---------------
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<ImageView
android:id="@+id/delete_image"
android:layout_width="60px"
android:layout_height="60px"
android:padding="10px"
android:scaleType="fitCenter"
/>
<LinearLayout
android:orientation="vertical"
android:layout_width="200px"
android:layout_height="60px"
>
<TextView
android:id="@+id/delete_name"
android:layout_width="200px"
android:layout_height="40px"
android:gravity="center_vertical"
android:textColor="#FFFFFFFF"
android:paddingLeft="10px"
android:textSize="17sp"
android:ellipsize="marquee"
/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="200px"
android:layout_height="20px"
>
<TextView
android:id="@+id/delete_time"
android:layout_width="100px"
android:layout_height="20px"
android:gravity="center_vertical"
android:textColor="#FF00FFFF"
android:paddingLeft="10px"
android:text="Time"
android:textSize="13sp"
android:ellipsize="marquee"
/>
<TextView
android:id="@+id/delete_size"
android:layout_width="100px"
android:layout_height="20px"
android:gravity="center_vertical"
android:textColor="#FFFFFF00"
android:paddingLeft="10px"
android:text="Size"
android:textSize="13sp"
android:ellipsize="marquee"
/>
</LinearLayout>
</LinearLayout>
<CheckedTextView
android:id="@+id/delete_checkbox"
android:layout_width="60px"
android:layout_height="60px"
android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="center_vertical"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:padding="6dip"
/>
</LinearLayout>
//------------TestDeleteList.java---------------
// 480 x 320
package com.diotek.DioNote;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import android.app.Activity;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CheckedTextView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
public class TestDeleteList extends Activity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.deletelistmain);
final ArrayList<ImageItem> imageList = new ArrayList<ImageItem>();
String filePath = "\\data\\app-private\\Sketchpad\\";
String jpgFormat = "bmp";
String fileNames[] = getFileList(filePath);
Log.d("Delete", "onCreate1");
Arrays.sort(fileNames);
Log.d("Delete", "onCreate2");
for(int i = 0; i < fileNames.length; i++) {
File fileName = new File(filePath, fileNames[i]);
if(jpgFormat.equals(getFileExt(fileNames[i]))) {
Bitmap cBitmap = BitmapFactory.decodeFile(filePath + fileNames[i]);
Log.d("Delete", "onCreate3");
ImageItem cItem = new ImageItem(fileNames[i], cBitmap, getFileModified(filePath + fileNames[i]), getFileSize(filePath + fileNames[i]));
Log.d("Delete", "onCreate4");
imageList.add(cItem);
Log.d("Delete", "onCreate5");
}
}
ImageListAdapter listAdapter = new ImageListAdapter(this, R.layout.deletelistrow, imageList);
ListView myListView = (ListView)findViewById(R.id.delete_list);
myListView.setAdapter(listAdapter);
Log.d("Delete", "onCreate6");
myListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ImageItem checkedItem = imageList.get(position);
Log.d("Delete", "onCreate7");
// List에서 하나의 Item(Row)를 클릭했을때 처리 필요
}
});
Button delete = (Button)findViewById(R.id.button3);
delete.setOnClickListener(new Button.OnClickListener(){
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(getApplicationContext(), TestDeleteList.class); // TestImageList.this
startActivity(intent);
}
});
}
private class ImageListAdapter extends ArrayAdapter<ImageItem> {
private ArrayList<ImageItem> items;
public ImageListAdapter(Context context, int textViewResourceId, ArrayList<ImageItem> items) {
super(context, textViewResourceId, items);
this.items = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
Log.d("Delete", "adapter1");
LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Log.d("Delete", "adapter2");
v = vi.inflate(R.layout.deletelistrow, null);
}
ImageItem p = items.get(position);
if (p != null) {
ImageView itemImage = (ImageView) v.findViewById(R.id.delete_image);
TextView itemName = (TextView) v.findViewById(R.id.delete_name);
TextView itemLastModified = (TextView) v.findViewById(R.id.delete_time);
TextView itemSize = (TextView) v.findViewById(R.id.delete_size);
Log.d("Delete", "adapter3");
//CheckedTextView itemCheckbox = (CheckedTextView) v.findViewById(R.id.delete_checkbox);
// Adapter를 통해 List의 Checkbox 컨트롤 필요
Log.d("Delete", "adapter4");
if (itemImage != null){
itemImage.setImageBitmap(p.getBitmap());
}
if(itemName != null){
itemName.setText(p.getName());
}
if(itemLastModified != null){
itemLastModified.setText(p.getLastModified());
}
if(itemSize != null){
itemSize.setText(p.getSize());
}
Log.d("Delete", "adapter5");
// Adapter를 통해 List의 Checkbox 컨트롤 필요
}
return v;
}
}
class ImageItem {
private String Name;
private Bitmap Bitmap;
private String LastModified;
private String Size;
//private CheckedTextView Checkbox;
// ItemClass에 Checkbox Class의 Instance를 생성해야 할지 여부.
public ImageItem(String _Name, Bitmap _Bitmap, String _LastModified, String _Size){
this.Name = _Name;
this.Bitmap = _Bitmap;
this.LastModified = _LastModified;
this.Size = _Size;
Log.d("Delete", "item1");
//this.Checkbox.setChecked(false);
Log.d("Delete", "item2");
}
public String getName() {
return Name;
}
public Bitmap getBitmap() {
return Bitmap;
}
public String getLastModified() {
return LastModified;
}
public String getSize() {
return Size;
}
}
public static String[] getFileList(String filePath) {
File fileList = new File(filePath);
String list[] = fileList.list();
return list;
}
public static String getFileExt(String fileName) {
if(fileName != null) {
int index = fileName.lastIndexOf(".");
String ext = null;
if(index != -1) {
ext = fileName.substring(index + 1);
}
return ext;
}
return null;
}
public static String getFileModified(String filePath) {
File file = new File(filePath);
Calendar calendar = new GregorianCalendar(Locale.KOREA);
calendar.setTime(new Date(file.lastModified()));
String year = String.valueOf(calendar.get(Calendar.YEAR));
String month = String.valueOf(calendar.get(Calendar.MONTH) + 1);
String date = String.valueOf(calendar.get(Calendar.DATE));
if(month.length() < 2) month = "0" + month;
if(date.length() < 2) date = "0" + date;
String yyyymmdd = new String(year + "-" + month + "-" + date);
return yyyymmdd;
}
public static String getFileSize(String filePath) {
File file = new File(filePath);
long length = file.length();
float floatSize = (float)((float)length / 1024.0);
//String fileSize = new String(floatSize + " K");
String fileSize = String.format("%.1f K", floatSize);
return fileSize;
}
}




intposition,longid)에서 view가 ListView입니다.
그러니
ListView listView = (ListView)view;
listView.getChild(position).getChild(xml에서 체크박스의 위치).setChecked(true);
하시면 됩니다.
일단 저는 이렇게 사용하고 있습니다. 더 좋은 방법이 있으면 공유 부탁 드립니다.