마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

CursorAdapter이용한 커스텀리스트아이템의 버튼클릭시 마지막 아이템도 함께 선택되는 문제 질문드립니다

0 추천

안녕하십니까. 안드로이드 스튜디오이용해서 과제 제작 중인 대학생입니다.

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를 사용해보라는 글이 있어서 이용해봤는데 제가 잘못 이해해서 사용한건지 해결이 안되더라구요..ㅠㅠ

처음 개발이라 이것저것 검색해가면서 만들어가고 있어 혹시 부족한 정보들이 있거나 어느 부분때문에 이렇게 되는지 알려주시면 감사하겠습니다ㅠㅠ!!

만두콩 (230 포인트) 님이 2019년 6월 18일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...