안녕하십니까. 안드로이드 스튜디오이용해서 과제 제작 중인 대학생입니다.
textView 2개, Button 1개로 이루어진 CustomListView를 이용해서
DB에 들어있는 정보들을 보여주는 List를 만들었습니다.
리스트 아이템은 무조건 가장 첫번째 아이템 부터 Button을 클릭 할 수 있게 되어있고, Button을 클릭하면 해당 리스트 아이템의 배경색,글자색이 바뀌게 만들었습니다.
그런데 첫번째 아이템 Buton을 클릭하면 첫번째 아이템과, 가장 맨 마지막 아이템이 함께 배경,글자색이 바뀝니다. 여러번 찾아보았지만 어느 부분 때문에 이런 현상이 발생하는지 찾질 못하였습니다.
package com.yongku.myyou.todays;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CursorAdapter;
import android.widget.TextView;
import android.widget.Toast;
import com.prolificinteractive.materialcalendarview.MaterialCalendarView;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import static com.yongku.myyou.todays.MainActivity.dbName;
import static com.yongku.myyou.todays.MainActivity.dbVersion;
public class DBAdapter extends CursorAdapter {
DBHelper dbHelper ;
SQLiteDatabase db;
String sql;
Cursor cursor1;
Cursor cursor2;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
static Calendar calendar = Calendar.getInstance();
static Date today = calendar.getTime(); //오늘
static String getTime;
public DBAdapter(Context context, Cursor c){
super (context ,c );
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(R.layout.list_item, parent, false);
return v;
}
@Override
public void bindView(final View view, final Context context, final Cursor cursor) {
final TextView priority = (TextView)view.findViewById(R.id.textPriority);
final TextView name = (TextView)view.findViewById(R.id.textName);
final Button button = (Button) view.findViewById(R.id.button);
dbHelper = new DBHelper(context,dbName,null,dbVersion);
priority.setText(cursor.getString(cursor.getColumnIndex("priority")));
priority.setTextColor(Color.parseColor("#5372c5"));
name.setText(cursor.getString(cursor.getColumnIndex("name")));
getTime = sdf.format(today);
final int position = cursor.getPosition();
cursor.moveToPosition(position);
if(cursor.getInt(5)==1){
//이미완료한 리스트이면
view.setBackgroundColor(Color.rgb(245,245,245));
name.setTextColor(Color.rgb(229,208,173));
}
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
db = dbHelper.getWritableDatabase();
sql = "SELECT MIN(priority) FROM t3 WHERE priority IN (SELECT priority FROM t3 WHERE finish = 0 and date like '"+getTime+"');"; //미완료일중 제일작은우선순위
cursor1 = db.rawQuery(sql,null);
cursor1.moveToFirst();
cursor.moveToFirst();
cursor.moveToPosition(position);
if(cursor.getInt(3)==cursor1.getInt(0)){
//선택한 버튼 리스트의 우선순위 == 미완료리스트중 가장적은 우선순위
view.setBackgroundColor(Color.rgb(245,245,245));
name.setTextColor(Color.rgb(229,208,173));
sql = "UPDATE t3 SET finish = 1 WHERE _id ="+ cursor.getInt(0);
db.execSQL(sql); //완료된 일 db에 완료했다고 저장
Log.d("테스트2", cursor.getPosition()+"");
}
else if(cursor.getInt(5)==1){
//완료한 리스트의 완료버튼을 다시 누르면
view.setBackgroundColor(0x00000000);
name.setTextColor(Color.rgb(0,0,0));
sql = "UPDATE t3 SET finish = 0 WHERE _id = "+ cursor.getInt(0);
db.execSQL(sql);
}
else{
Log.d("커서","버튼클릭안됨");
Toast.makeText(context,"급선무부터 완료 해 주세요!",Toast.LENGTH_SHORT).show();
}
sql = "SELECT * FROM t3 where date like '"+getTime+"' ORDER BY priority ASC;";
cursor2 = db.rawQuery(sql,null);
changeCursor(cursor2);
notifyDataSetChanged();
}
});
}
}
CursorAdapter부분입니다.
list = (ListView)findViewById(R.id.listView);
sql = "SELECT * FROM t3 where date like '"+SelectedDateToString+"' ORDER BY priority ASC;";
cursor = db.rawQuery(sql,null);
cursor.moveToFirst();
if(cursor.getCount()>0){
for(int i=0; i<cursor.getCount(); i++){
dbAdapter = new DBAdapter(this,cursor);
list.setAdapter(dbAdapter);
cursor.moveToNext();
}
}
main문에서 db에 있는 내용들을 list에 보여주는 부분입니다.
ListView를 리사이클러뷰로 바꿔야 좋다는걸 알게되었는데 바꾸기에는 마감기한이 얼마 남지 않아서 고칠 수 있는 부분이면 최대한 고쳐보고 싶습니다.
외국글 찾아 보니 button click이 항상 last row 를 업데이트 해줘서 그런거라 setTag를 사용해보라는 글이 있어서 이용해봤는데 제가 잘못 이해해서 사용한건지 해결이 안되더라구요..ㅠㅠ
처음 개발이라 이것저것 검색해가면서 만들어가고 있어 혹시 부족한 정보들이 있거나 어느 부분때문에 이렇게 되는지 알려주시면 감사하겠습니다ㅠㅠ!!