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

sqlite 커스텀리스트뷰 id값 불러오기 질문입니다.

0 추천

위 그림처럼 '나'부터'하'까지의 커스텀 리스트뷰를 저장했는데요

'나'를 클릭하면 toast로 출력했을때 포지션값이-0///커서ID가-2 로 찍힙니다

그리고 '하'를 클릭하고  toast로 출력했을때 포지션값이-12//커서ID가-14로 잘 찍히는데요

위에 그림처럼 getfilter로 검색결과를 뿌려줘서 다시 저 '하'를 클릭하면 

toast로 출력했을때 포지션값이-0///커서ID가-2 로 찍힙니다ㅠ

toast로 출력했을때 커서ID가-14로 찍히게 하고 싶은데ㅠ

커스텀 리스트를 클릭할때는 저기 써져있는 url주소로 잘 넘어가거든요?근데 id 값만 잘 설정이 안되네요ㅠ

아래는 FavoriteActivity입니다

//이건 캡쳐화면에 보여지는 엑티비티입니다

public  void onCreate( final Bundle savedInstanceState) {
		
                list = (ListView) findViewById( R.id.file_list );
		dbHelper = new FavoriteDBHelper(this);
	
		arSrc = FavoriteDB.selectAllFile(dbHelper);
		adapter=new ListAdapter( this, R.layout.favorite_list_view_layout,arSrc, arSrc, null );
		list.setAdapter( adapter );
		
		list.setOnItemClickListener(new OnItemClickListener() {
			@Override
		    public void onItemClick(AdapterView<?> parent, View v, int position, long id){
				Cursor cs = null;
				SQLiteDatabase db = dbHelper.getReadableDatabase();
				
				String sq = "SELECT * FROM file2";
				cs = db.rawQuery( sq , null );
				
		       FavoriteFile mData = adapter.arSrc.get(position);
		       cs.moveToPosition(position+1);
		       Toast.makeText(FavoriteActivity.this,"<adapterPosition-"+adapter.getItemId(position)+">"+"<CursorId-"+cs.getInt(0)+">"+id, Toast.LENGTH_SHORT).show();
		        WebViewActivity.webUrl=mData.favUrl;
		        Intent myIntent = new Intent(FavoriteActivity.this,WebViewActivity.class);
				startActivity(myIntent);
		    }
		});	

//아래는 위 엑티비티의 리스트어댑터와 getFilter해서 화면에 다시 뿌려주는 소스입니다

class ListAdapter extends CursorAdapter  {
	
	Context maincon;
	LayoutInflater Inflater;
	ArrayList<FavoriteFile> arSrc = new ArrayList<FavoriteFile>();
	ArrayList<FavoriteFile> OriginarSrc = arSrc;
	private Filter ListFilter;
	int layout;
	
	
	
	public ListAdapter(Context context, int layout,ArrayList<FavoriteFile> OriginarSrc, ArrayList<FavoriteFile> arSrc, Cursor cs) {
		
		super(context, cs, layout);
		this.maincon = context;
		this.Inflater = (LayoutInflater) context
				.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		this.arSrc = arSrc;
		this.layout = layout;

	}

	public int getCount() {
		return arSrc.size();
	}

	public String getItem(int position) {
		return arSrc.get(position).getFileName();
	}

	public long getItemId(int position) {
		return position;
	}
public View getView(int position, View convertView, ViewGroup parent) {
		
if (convertView == null) {
			convertView = Inflater.inflate(layout, parent, false);
		}
		
		byte[] outImage = arSrc.get(position).getIcon();
		ByteArrayInputStream imageStream = new ByteArrayInputStream(outImage);
		Bitmap theImage = BitmapFactory.decodeStream(imageStream);
		ImageView img = (ImageView) convertView.findViewById(R.id.filelist_img);
		img.setImageBitmap(theImage);

		TextView textFilename = (TextView) convertView
				.findViewById(R.id.filelist_filename);
		textFilename.setText(arSrc.get(position).getFileName());
		
		TextView textFilesize = (TextView) convertView
				.findViewById(R.id.filelist_filesize);
		textFilesize.setText(arSrc.get(position).getFavUrl() );
		
		
		return convertView;
	}

	
	public Filter getFilter() {
		if (ListFilter == null)
			ListFilter = new ListFilter();
		
		return ListFilter;
	}
	
	private class ListFilter extends Filter {
		@Override
		protected FilterResults performFiltering(CharSequence constraint) {
			FilterResults results = new FilterResults();
			if (constraint == null || constraint.length() == 0) {
				results.values = OriginarSrc;
				results.count = OriginarSrc.size();
			}
			else {
				// We perform filtering operation
				ArrayList<FavoriteFile> nListDataList = new ArrayList<FavoriteFile>();
				
				for (FavoriteFile p : arSrc) {
					if (p.getFileName().toUpperCase().indexOf( constraint.toString().toUpperCase() ) >= 0 )
						nListDataList.add(p);
						//System.out.println(p.toString());
					
				}
				
				results.values = nListDataList;
				results.count = nListDataList.size();

			}
			
			return results;
		}

		@Override
		protected void publishResults(CharSequence constraint,
				FilterResults results) {
			
			// Now we have to inform the adapter about the new list filtered
			if (results.count == 0){
				notifyDataSetInvalidated();
				
				arSrc = FavoriteDB.selectAllFile(FavoriteActivity.dbHelper);
				FavoriteActivity.list.setAdapter( FavoriteActivity.adapter );
			}
			else {
				arSrc = (ArrayList<FavoriteFile>) results.values;
				notifyDataSetChanged();
			}
			
		}
	
		
	}

 

그리고 아래 코드는 SQlite에 데이터를 저장하는 소스입니다

public void addList(View view, final byte[] byteArray) {

	    	
	    	final EditText edit = (EditText) d.findViewById(R.id.editTextList);
	    	Button b = (Button) d.findViewById(R.id.addBtn);
	    	d.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

	    	  
	    	b.setOnClickListener(new View.OnClickListener() {
				
				public void onClick(View v) {
					String ListName = edit.getText().toString();
					String FavUrl=webView1.getUrl();
					Cursor cs = null;
					SQLiteDatabase db = FavoriteActivity.dbHelper.getReadableDatabase();
					String sq = "SELECT * FROM file2";
					cs = db.rawQuery( sq , null );
					FavoriteFile item1= new FavoriteFile( byteArray, ListName, FavUrl );
					FavoriteDB.insertFile(item1, FavoriteActivity.dbHelper);
					Toast.makeText(WebViewActivity.this,ListName+"가 추가되었습니다", Toast.LENGTH_SHORT).show();
					d.dismiss();
				}
			});
	    	
	    	d.show();
	    }
			 

아래는 FavoriteDB입니다다



public class FavoriteDB {

	public static ArrayList<FavoriteFile> selectAllFile( FavoriteDBHelper dbHelper ){
		ArrayList<FavoriteFile> list = null;
		Cursor cs = null;
		SQLiteDatabase db = dbHelper.getReadableDatabase();
		list = new ArrayList<FavoriteFile>();
		
		String sql = "SELECT * FROM file2";
		
		cs = db.rawQuery( sql , null );
		
	
		if(cs!=null&&cs.getCount()!=0)
		{
			
			cs.moveToFirst();
			
		}
		
		while (cs.moveToNext()) {
			FavoriteFile item = new FavoriteFile( cs.getBlob(1), cs.getString(2), cs.getString(3) + "" );
			list.add(item);
		}
		cs.close();
		db.close();
		return list;
	}
	
	public static void insertFile( FavoriteFile vo, FavoriteDBHelper dbHelper ){
		SQLiteDatabase db = dbHelper.getWritableDatabase();
		
		String sql = "INSERT INTO file2 (IMAGE,filename,URL)VALUES (?,?,?);";
		SQLiteStatement smt = db.compileStatement(sql);
		
		smt.bindBlob(1, vo.getIcon());
		smt.bindString(2, vo.getFileName());
		smt.bindString(3, vo.getFavUrl());
		smt.executeInsert();

		Log.i("mylog", sql.toString());
		//db.execSQL( sql.toString() );
		db.close();
	}
	
	
	
}

아래는 FavoriteDBHelper입니다

public class FavoriteDBHelper extends SQLiteOpenHelper {

	public FavoriteDBHelper( Context context ){
		super( context, "file2.sqlite", null, 1 );
		Log.i("mylog", "FavoriteDBHelper");
	}
	


	public void onCreate( SQLiteDatabase db ){
		String sql;
		
		sql = "create table file2 ( _id integer primary key autoincrement,"
				+ "IMAGE BLOB,"
				+ "FILENAME TEXT,"
			+ "URL TEXT );";
		Log.i("mylog", sql );
		db.execSQL( sql );
		
	}


}

아래는 FavoriteFile입니다(다 안올라가서 사진으로 넣겠습니다 ㅜㅜㅜㅜ)

나는안드로오 (960 포인트) 님이 2014년 9월 17일 질문

1개의 답변

+1 추천
 
채택된 답변

쉽게 끝날 일 같은데 오래 가는군요 ;;;

예제 : https://github.com/susemi99/TestDBListView

 

FavoriteFile item = new FavoriteFile( cs.getBlob(1), cs.getString(2), cs.getString(3) + "" );

커서에서 값을 가져올 때 이렇게 하지 말고 

String id = cursor.getString(cursor.getColumnIndex(PeopleTable.ID));

이런 식으로 컬럼 값을 지정해서 가져오게 해보세요 

쎄미 (162,410 포인트) 님이 2014년 9월 17일 답변
나는안드로오님이 2014년 9월 19일 채택됨
답변주신 쎄미님 너무 감사합니다 결국 해결하였습니다 ㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ
...