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