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

리스트뷰 추가시키기 길게 눌러 삭제하기가 안돼요 도와주세요

0 추천
package com.example.a.wiho;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.CursorAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;

public class PlusActivity extends Activity {

    private ArrayList<String> aitems;

    private EditText eName;
    private EditText eAge;

    MyDBHelper mHelper;
    SQLiteDatabase db;
    Cursor cursor;
    MyCursorAdapter myAdapter;

    final static String KEY_ID = "_id";
    final static String KEY_NAME = "name";
    final static String KEY_AGE = "age";
    final static String TABLE_NAME = "mytable";

    final static String querySelectAll = String.format("SELECT * FROM %s", TABLE_NAME);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_plus);

        ListView list = (ListView) findViewById(R.id.lv_name_age);

        mHelper = new MyDBHelper(this);
        db = mHelper.getWritableDatabase();

        cursor = db.rawQuery(querySelectAll, null);

        aitems = new ArrayList<String>();

        myAdapter = new MyCursorAdapter(this, cursor, aitems);

        list.setAdapter(myAdapter);
        list.setOnItemLongClickListener(new ListViewItemLongClickListener());

    }

    private Button.OnClickListener clickListener = new Button.OnClickListener() {

        @Override
        public void onClick(View view) {

            eName = (EditText) findViewById(R.id.et_name);
            eAge = (EditText) findViewById(R.id.et_age);

            String name = eName.getText().toString();
            String age = eAge.getText().toString();

            if (eName.getText().toString().equals(""))
            {
                Toast.makeText(PlusActivity.this, "Wifi의 이름을 입력하세요.", Toast.LENGTH_SHORT).show();
            }
            // 와이파이 비밀번호가 없을 시
            else if(eAge.getText().toString().equals(""))
            {
                // 문자열은 ''로 감싸야 한다.
                String query = String.format(
                        "INSERT INTO %s VALUES ( null, '%s', null);", TABLE_NAME, name, age);
                db.execSQL(query);

                // 아래 메서드를 실행하면 리스트가 갱신된다. 하지만 구글은 이 메서드를 deprecate한다. 고로 다른 방법으로 해보자.
                // cursor.requery();
                cursor = db.rawQuery(querySelectAll, null);
                myAdapter.changeCursor(cursor);
            }
            // 와이파이 이름과 비밀번호가 다 있을 시
            else
            {
                // 문자열은 ''로 감싸야 한다.
                String query = String.format(
                        "INSERT INTO %s VALUES ( null, '%s', %s );", TABLE_NAME, name, age);
                db.execSQL(query);

                // 아래 메서드를 실행하면 리스트가 갱신된다. 하지만 구글은 이 메서드를 deprecate한다. 고로 다른 방법으로 해보자.
                // cursor.requery();
                cursor = db.rawQuery(querySelectAll, null);
                myAdapter.changeCursor(cursor);
            }

            eName.setText( "" );
            eAge.setText( "" );

                // 저장 버튼 누른 후 키보드 안보이게 하기
            InputMethodManager imm =
                    (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(eAge.getWindowToken(), 0);

        }

    };

    class MyCursorAdapter extends CursorAdapter {

        @SuppressWarnings("deprecation")
        public MyCursorAdapter(Context context, Cursor c, ArrayList<String> aitems) {
            super(context, c);
        }

        @Override
        public void bindView(View view, Context context, Cursor cursor) {
            TextView tvName = (TextView) view.findViewById(R.id.tv_name);
            TextView tvAge = (TextView) view.findViewById(R.id.tv_age);

            String name = cursor.getString(cursor.getColumnIndex(KEY_NAME));
            String age = cursor.getString(cursor.getColumnIndex(KEY_AGE));

            Log.d("스트링 확인", name + ", " + age);

            tvName.setText(name);
            tvAge.setText(age);
        }

        @Override
        public View newView(Context context, Cursor cursor, ViewGroup parent) {
            LayoutInflater inflater = LayoutInflater.from(context);
            View v = inflater.inflate(R.layout.alist_item, parent, false);
            return v;
        }

    }

    class MyDBHelper extends SQLiteOpenHelper {
        public MyDBHelper(Context context) {
            super(context, "MyData.db", null, 2);
        }

        public void onCreate(SQLiteDatabase db) {
            // AUTOINCREMENT 속성 사용 시 PRIMARY KEY로 지정한다.
            String query = String.format("CREATE TABLE %s ("
                    + "_id INTEGER PRIMARY KEY AUTOINCREMENT, "
                    + "%s TEXT, "
                    + "%s INTEGER );", TABLE_NAME, KEY_NAME, KEY_AGE);
            db.execSQL(query);
        }

        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            String query = String.format("DROP TABLE IF EXISTS %s", TABLE_NAME);
            db.execSQL(query);
            onCreate(db);
        }

    }

    // Long click된 item의 index를 기록
    int selectedPos = -1;

    // ListView의 item을 길게 클릭
    private class ListViewItemLongClickListener implements AdapterView.OnItemLongClickListener
    {

        @Override

        public boolean onItemLongClick(AdapterView<?> parent, final View view, int position, long id)
        {
            selectedPos = position;
            AlertDialog.Builder alertDlg = new AlertDialog.Builder(view.getContext());
            alertDlg.setTitle(R.string.alert_title_question);

            // '예' 버튼 클릭
            alertDlg.setNegativeButton( R.string.button_yes, new DialogInterface.OnClickListener()
            {

                @Override

                public void onClick( DialogInterface dialog, int which )
                {
                    aitems.remove(selectedPos);

                    // method를 호출하지 않을 경우
                    myAdapter.notifyDataSetChanged();

                    // AlertDialog를 종료
                    dialog.dismiss();
                }
            });

            // '아니오' 버튼 클릭
            alertDlg.setPositiveButton( R.string.button_no, new DialogInterface.OnClickListener()
            {

                @Override

                public void onClick( DialogInterface dialog, int which ) {

                    // AlertDialog를 닫는다.
                    dialog.dismiss();
                }
            });

            alertDlg.setMessage(String.format(getString(R.string.alert_msg_adelete), aitems.get(position)));
            alertDlg.show();
            return false;
        }

    }

}

 

익명사용자 님이 2016년 10월 17일 질문

1개의 답변

0 추천

android:longClickable="true" 

listView.setLongClickable(true);

둘 중의 하나가 세팅되어 있는지 확인해 보세요.

 

spark (230,170 포인트) 님이 2016년 10월 17일 답변
둘 다 추가시켜봤는데도 안되는군요
그냥 평범한 리스트뷰에서는 잘만 되는데 원인을 모르겠습니다.
안되는 원인을 좁혀 보세요. 해당 이벤트가 호출이 안되는지, 이벤트는 호출이 되지만 삭제가 제대로 안되는 건지.
앱을 실행하면 정상적으로 작동은 하는데
버튼을 누르면 튕겨버리고 길게 눌러도 튕겨버립니다.
원인이 어디인지 잘 모르겠어요 ㅠㅠ
소스로 봐서는 모르겠네요. 에러 로그가 있다면 그걸 확인하셔야 할 것 같아요.
...