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

커스텀 listview 안의 getview에서 만들어진 checkbox 체크여부

0 추천

 

 

안녕하세요!

 

오늘도 수고가 정말 많으십니다 ㅠㅜ

 

다름이 아니라 제가 커스텀listview를 만들고 getview에서 해당 포지션에 checkbox를 넣어서

 

만들어지 Activity에서

 

화면 띄웠을때 체크박스를 클릭해서 선택하면 

 

밑에 [확인]버튼 를 클릭시 체크된 해당 포지션의 정보들을 DB안에 넣을려고 하는데요.

 

다했는데 버튼안에 onclick안에 소스를 어떻게 넣을지 고민하다가 막혀서 이렇게 글을 올립니다 ㅠㅜ

 

일단 소스 입니다

 


//테마 관리 해당 장르 체크 창
public class SetThemeManageListActivity extends Activity {

	Context mContext;
	LayoutInflater inflater;
	View reView;
	View reViewTitle;

	ArrayList<ListItem> arItem;

	protected void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.set_thememanage_list);

		// 레이아웃을 선언하기 위해서 필요한 소스 선언합니다.
		mContext = getApplicationContext();
		inflater = (LayoutInflater) mContext
				.getSystemService(LAYOUT_INFLATER_SERVICE);
		
		
		Button btnOk = (Button)findViewById(R.id.set_thememanage_list_btn_ok);
		

		// 디비 선언
		DBHelper testHelper = new DBHelper(this);
		SQLiteDatabase db = testHelper.getWritableDatabase();

		Cursor cursor;

		// cursor선언해서 한 행에 찾는거 자신의 디비 찾는거 모든 정보를 가져온다.
		cursor = db.rawQuery("SELECT * FROM db_thememanager", null);
		startManagingCursor(cursor);

		// 데이터를 넣는 아이템 리스트입니다.
		arItem = new ArrayList<ListItem>();

		// 커서 안에 넣은 해당 디비의 정보값들을 하나씩 넣는다.
		while (cursor.moveToNext()) { // 다음 한칸? 컬럼??
			String cmtitle = cursor.getString(0); // cursor.getString(해당 컬럼 인덱스)
			int cimg = cursor.getInt(1);
			String ctinfo = cursor.getString(2);
			int ccheck = cursor.getInt(4);

			// 로그캣에 정보가 제대로 들어왔는지 확인하는 로그캣
			Log.i("LEEJIN", cmtitle);
			Log.i("LEEJIN", String.valueOf(cimg));
			Log.i("LEEJIN", ctinfo);
			Log.i("LEEJIN", String.valueOf(ccheck));

			// 밑소스는 밑에 VO에 정보값을 넣는고 바로 그 정보값으로 getView로 Activity만든다.
			arItem.add(new ListItem(0, cmtitle, cimg, ctinfo, ccheck));

			// cursor.안에 정보값다 될때까지 반복된다.
		}

		// //데이터를 넣는 아이템 리스트입니다.
		// arItem = new ArrayList<ListItem>();

		// arItem.add(new ListItem(0,0x7f02002b, "아이디입니다", 1, "1000원"));

		// 데이터 원본 준비
		// arrayThemeName = new ArrayList<String>();

		// 어댑터 준비
		MultiAdapter MyAdapter = new MultiAdapter(this, arItem);

		// 어댑터 연결
		ListView MyList;

		MyList = (ListView) findViewById(R.id.set_thememanage_list_list);
		MyList.setAdapter(MyAdapter);
		
		
		
		

		
		btnOk.setOnClickListener(new OnClickListener() {
			// 클릭 이벤트를 처리한다.
			public void onClick(View v) {
				

			}
		});

	}

	class ListItem {
		int Type;// 항목뷰를 어떤걸 나타낼 것인지 0이면 textedit.xml 1이면 btnicon.xml

		int Img;
		int MCheck;
		String MText;
		String Tinfo;

		ListItem(int aType, String aMText, int aImg, String aTinfo, int acheck) {
			Type = aType;

			Img = aImg;
			MCheck = acheck;
			MText = aMText;
			Tinfo = aTinfo;

		}

	}

	// 전 예제랑 비슷합니다. 오버라이딩할것은 하고
	class MultiAdapter extends BaseAdapter {

		LayoutInflater mInflater;
		ArrayList<ListItem> arSrc;

		// 생성자
		public MultiAdapter(Context context, ArrayList<ListItem> arItem) {
			// 인플레이트 준비를 합니다.
			mInflater = (LayoutInflater) context
					.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
			arSrc = arItem;
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return arSrc.size();
		}

		@Override
		public ListItem getItem(int position) {
			// TODO Auto-generated method stub
			return arSrc.get(position);
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return position;
		}

		public int getItemViewType(int position) {
			return arSrc.get(position).Type;// 아까 Type가 0이면 textedit고 1이면
											// btnicon이라고했죠?
		}

		// getView가 생성하는 뷰의 개수를 리턴한다. 항상 같은 뷰를 생성하면 1을 리턴한다.
		// 지금 예제에서는 btnicon이라는 뷰와 textedit라는 뷰 2개 이므로 2를 리턴해야합니다.
		public int getViewTypeCount() {
			return 2;
		}

		@Override
        public View getView(final int position, View convertView, ViewGroup parent) {
              // TODO Auto-generated method stub
              int res = 0;

              //최초 호출이면 항목 뷰를 생성한다.
              //타입별로 뷰를 다르게 디자인 할 수 있으며 높이가 달라도 상관없다.
              if(convertView == null){
             
                     res = getItemViewType(position);//현재 위치의 Type을 조사해보고
                     switch(res){
                     case 0://0이면 textedit
                            res = R.layout.set_thememanage_list_listview;
                            break;
//                     case 1://1이면 btnicon으로 R.layout값을 넣어주고
//                            res = R.layout.btnicon;
//                            break;
                     }
                    
                     //아래 부분은 전예제에서 설명했죠? 중요한것은 res를 넘기는 것만 알아두시면 되고
                     //필요하면 다시 찾아서 보면됩니다
                     //인플레이트합니다. 즉 화면에 뿌립니다.
                     convertView = mInflater.inflate(res, parent, false);
              }
                     //화면에 뿌린뒤 여기서 각항목에 해당하는 값을 바꿔주는 부분입니다.
                     res = getItemViewType(position);
                     switch(res){
                     case 0:                    	 
                            ImageView imgTitle = (ImageView)convertView.findViewById(R.id.set_thememanage_list_img);
                            imgTitle.setImageResource(arSrc.get(position).Img);
                            
                            TextView txtMtitle = (TextView)convertView.findViewById(R.id.set_thememanage_list_mtitle);
                            txtMtitle.setText(arSrc.get(position).MText);

                            TextView txtTinfo = (TextView)convertView.findViewById(R.id.set_thememanage_list_tinfo);
                            txtTinfo.setText(arSrc.get(position).Tinfo);
                            
                            CheckBox tmCheck = (CheckBox)convertView.findViewById(R.id.set_thememanage_list_listview_checkBox);
         
                            
                            if(arSrc.get(position).MCheck == 1){
                            	tmCheck.setChecked(true);
                            }else{
                            	tmCheck.setChecked(false);
                            }
      
                            break;
//                     case 1:
//                            Button btn = (Button)convertView.findViewById(R.id.btn);
//                            btn.setText(arSrc.get(position).BtnText);
//                            ImageView img = (ImageView)convertView.findViewById(R.id.img);
//                            img.setImageResource(arSrc.get(position).IconRes);//이미지의 리소스를 지정합니다.
//                            //즉 이미지의 경로가됨
//                            break;
                     }

              return convertView;//getCount만큼 반복한다고 했죠?
              //리스트의 갯수만큼 반복하게 됩니다.
        }
	}

}

위의 소스에서 빨간색이 버튼 이벤트이고요ㅠㅜ

 

그 노란색이 getview에서 만들어지는 선언들입니다.

버튼 클릭시 안드로이드 SQL DB안에 

 

체크되어있는 해당 포지션의 

 

txtMtitle

이 정보값이 들어가야 되는데요...

 

어떻게 해야 될지 모르겠습니다...

 

제가 초보개발자이고 학생이다보니 ㅠㅜ

혼내도 좋으시니까 조언이랑 제가 응용할 수 있도록 약간의 예시 소스를 올려주시면 좋겠습니다 ㅠㅜ

 

좋은 하루 되세요!

가비저 (200 포인트) 님이 2013년 2월 22일 질문
아 위에 소스중에 색상을 바꿨는데 표시가 안났네요 ㅠㅜ

btnOk.setOnClickListener(new OnClickListener() {
            // 클릭 이벤트를 처리한다.
            public void onClick(View v) {
                
            }
        });

이 부분이 빨간색이고



ImageView imgTitle = (ImageView)convertView.findViewById(R.id.set_thememanage_list_img);
                            imgTitle.setImageResource(arSrc.get(position).Img);
                             
                            TextView txtMtitle = (TextView)convertView.findViewById(R.id.set_thememanage_list_mtitle);
                            txtMtitle.setText(arSrc.get(position).MText);
 
                            TextView txtTinfo = (TextView)convertView.findViewById(R.id.set_thememanage_list_tinfo);
                            txtTinfo.setText(arSrc.get(position).Tinfo);
                             
                            CheckBox tmCheck = (CheckBox)convertView.findViewById(R.id.set_thememanage_list_listview_checkBox);
          
                             
                            if(arSrc.get(position).MCheck == 1){
                                tmCheck.setChecked(true);
                            }else{
                                tmCheck.setChecked(false);
                            }


getview안에있는 이 소스가 노란색입니다 ㅠㅜ

감사합니다
어레이리스트에 boolean 변수하나 두시고
falsef로 초기잡고.... 체크할경우 해당 포지션 변수 true  해제할경우 false로
하시고 ok 버튼에서 포문돌면서 체크한값들만 모아서 디비에 때려박아넣으시길

1개의 답변

0 추천

리스트뷰 내의 컴포넌트의 클릭리스너를 구현하시려면

OnItemClickListener 를 사용하시면 됩니다.

 

itemClicker = new OnItemClickListener() {
 
@Override
public void onItemClick(AdapterView<?> 데이터, View 클릭한뷰, int 아이템번호, long arg3) {
}
};
Noizbuster (11,970 포인트) 님이 2013년 2월 24일 답변
...