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

listview에 db의 값을 넣었더니 중복돼서 나옵니다.!

0 추천
package com.andro;

import java.util.ArrayList;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

public class MemoListActivity extends Activity{
	ArrayAdapter<String> mAdapter;
	DBManager dbmgr;
	SQLiteDatabase sql;
	ListView lv;
	ArrayList<String> AL;
	Cursor cursor;
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		dbmgr = new DBManager(MemoListActivity.this);
		
		setTitle("목  록");
		AL = new ArrayList<String>();
		lv = (ListView)findViewById(R.id.list);
		mAdapter = new ArrayAdapter<String>(MemoListActivity.this,android.R.layout.simple_list_item_single_choice, 
					AL);//
		
        
		lv.setAdapter(mAdapter);
		lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);		
		lv.setOnItemClickListener(mItemClickListener);		

		Button btn_all = (Button)findViewById(R.id.btn_all);
		btn_all.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				sql=dbmgr.getWritableDatabase();
				sql.execSQL("delete from MEMO");
				
				Toast.makeText(MemoListActivity.this, mAdapter.getCount()+"개의 메모가 삭제 되었습니다.",Toast.LENGTH_SHORT).show();
				mAdapter.clear();
			}
		});
		
		Button btn_del = (Button)findViewById(R.id.btn_del);	
		btn_del.setOnClickListener(new View.OnClickListener() {//삭제버튼
			public void onClick(View v) {
				int id = lv.getCheckedItemPosition();
	              if(id != ListView.INVALID_POSITION) {
	                   AL.remove(id);
	                   lv.clearChoices();
	                   mAdapter.notifyDataSetChanged();
	              }
			}
		});	
		
		Button btn_re = (Button)findViewById(R.id.btn_re);		
		btn_re.setOnClickListener(new View.OnClickListener() {//편집버튼
			public void onClick(View v) {
				int id = lv.getCheckedItemPosition();
					if(id != ListView.INVALID_POSITION){
						String IT = AL.get(id).toString();
						Intent it = new Intent(MemoListActivity.this, GetActivity.class);
						it.putExtra("Title", IT);
						startActivityForResult(it,1);
						finish();
					}				
			}
		});	
	
		Button button = (Button)findViewById(R.id.btn_add);		
		 button.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				addStringData();				
			}
		});	//추가버튼
	}
	private void addStringData(){ //DB 값 넘겨주는걸로 다시 만들어야됨.
		
			EditText edit = (EditText)findViewById(R.id.edit_text);
			if(edit.getText().toString().length()<=0){
				AlertDialog.Builder alert = new AlertDialog.Builder(this);
				alert.setTitle("경 고 창");
				alert.setMessage("값을 입력 하세요.");
				alert.setPositiveButton("확인", null);
				alert.show();
			}//경고창
			
				try{
					sql = dbmgr.getWritableDatabase();
					sql.execSQL("insert into MEMO values('"+edit.getText().toString()+"',null);");
					cursor = sql.rawQuery("select title from MEMO", null);
						while (cursor.moveToNext()){
							mAdapter.add(cursor.getString(0));	
						}
						cursor.close();
						dbmgr.close();
					}catch(SQLiteException e){					
					Toast.makeText(MemoListActivity.this, e.toString(), Toast.LENGTH_LONG).show();
					//에러처라부분
					}				
		}
AdapterView.OnItemClickListener mItemClickListener = new AdapterView.OnItemClickListener() {	//Toast
	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
		 String mes = "제    목  = " + AL.get(position);	        		
         Toast.makeText(MemoListActivity.this, mes, Toast.LENGTH_SHORT).show();
		}
	};				// 아이템 선택시 제목 Toast로 띄워주기

}

위와같은 소스를 사용할 경우

맨처음 Test 1을 입력하면 Test 1 만 listview 에 들어갑니다. 

하지만 Test 2를 다시 입력하면 Test 1 과 함께 같이 들어갑니다 ㅠㅠ

ex)Test 1 입력시

Test 1                          <<ㅎ나만 표시

ex2)Test 2 입력시

Test 1 

Test 1

Test 2                                     << 즉 모든 DB의 값을 가져오는것 같은데 어디를 손봐줘야 될까요 ?? 도움이 필요합니다!

박상길 (220 포인트) 님이 2013년 8월 21일 질문
while문 전에 mAdapter를 초기화 하면 될것 같습니다.

1개의 답변

+1 추천
 
채택된 답변
db 값은 한개 씩 들어가는 구조 인거 같은데...

 

lv 리스트뷰에 add 하는 형식이라 1 / 1 / 2 같이 스택형식으로 쌓여 보이는거 같네요

 

cursor.getCount(); 해보시면 2개 넣으신거면 2개값만 나온걸껍니다 이러면 db 엔 문제 업구..

 

lv 에 adapter 로 뿌려줄때 로직을 보시는게 좋을듯
AND chobo (4,690 포인트) 님이 2013년 8월 21일 답변
박상길님이 2013년 8월 21일 채택됨
감사합니다.
87번째줄에 mAdapter.clear();을 입력해주니 되네요 ㅎㅎ
...