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

커스텀 리스트뷰 뷰홀더에 대해..

0 추천

안녕하세요.

커스텀 리스트뷰와 내부 DB(sqlite)를 이용하여 대화내용을 출력해주는

레이아웃을 구현하고 있습니다.

대화내용layout/시간타이틀layout 이 두개를 커스텀 리스트뷰에 출력하고 있는데요, 

대화내용을 추가할 때마다 DB에도 추가가 됩니다. [대화메세지/시간 등]

대화내용을 롱 클릭해서 DB내에서 조회해서 삭제 한 후,  다시 갱신해서 보여주려고 하는데

pk값으로 조회해서 삭제하려고 합니다. 

뷰홀더로 해당 대화내용의 pk값을 저장했다가. 롱클릭했을 때 해당 메세지의 pk값을 확인 후,

sql로 삭제하려고 하는데, 롱클릭 부분의 toast...즉, holder.date_tv.getTag().toString() 이 부분에서 에러가 

발생합니다. 현재는 pk값이 아닌 날짜값만 조회하려고 하는데 널포인트익셉션이 발생합니다.;

어느 부분에서 값이 저장이 안된건지 모르겠습니다. ㅠ

 

onCreate에서 db데이터를 조회해서 순서대로 출력합니다.

(getview에서 대화형식[0]인지, 타이틀[1]인지 구별해서 각각 다른 레이아웃 형식으로 출력)

 

public View getView(int position, View convertView, ViewGroup parent) 
		{
			
			//View view = null;
			final ViewHolderItem holder;
			//요청하는 항목에 해당하는 데이터 객체를 얻는다.
			ExamData data = m_data_list.get(position);
			// 해당 항목의 뷰 타입을 얻는다.
			int type = getItemViewType(position);
			//final ExamData data =null;
//			/ExamData data;
			// convertView 뷰는 어댑터가 현재 가지고 있는 해당 항목의 뷰객체이다.
			// null 이 넘어오는 경우에만 새로 생성하고, 그렇지않은 경우에는 그대로 사용한다.
			if (convertView == null) 
			{
				Log.d("convertView is null","convertView is null");
				holder = new ViewHolderItem();
				//view = m_inflater.inflate(R.layout.list_item1, null);
				switch (type) 
				{
					case 0://대화형식
						convertView = m_inflater.inflate(R.layout.list_item1, null);
						if (data != null) 
						{
						
							holder.user_tv = (TextView) convertView.findViewById(R.id.user_view1);
							holder.msg_tv = (TextView) convertView.findViewById(R.id.message_view1);
							holder.date_tv = (TextView) convertView.findViewById(R.id.date_view1);
							
							// 이름, 메세지, 시간정보를 텍스트뷰에 설정한다.
							holder.user_tv.setText(data.data0); //이름
							holder.msg_tv.setText(data.data1); //메세지
							holder.date_tv.setText(data.data2); //시간정보
							
							convertView.setTag(holder);
						}
					break;
					
					case 1://시간타이틀
						convertView = m_inflater.inflate(R.layout.list_item3, null);
						if(data!=null)
						{
							((TextView) convertView).setText(data.data0);
						}
					break;
				}

			} 
			else //convertview is not null
			{
				holder = (ViewHolderItem)convertView.getTag();
				
			}
	
			//삭제
			m_list.setOnItemLongClickListener(new OnItemLongClickListener() 
			{
				@Override
				public boolean onItemLongClick(AdapterView<?> parent, View view,
						int position, long id) 
				{
					Toast.makeText(getApplicationContext(),holder.date_tv.getTag().toString(), 1000).show();
					//delete_dialog(position);
					return true;
					//data에 pk값도 추가해서 클릭으로 선택시, pk값을 얻어온 후 그 값으로 delete..
				}
				
			});
			
				
				
				
			//not null
			return convertView;
		}
	}

	
	  public static class ViewHolderItem
	  {
	    TextView user_tv=null;
		TextView msg_tv=null;
	    TextView date_tv=null;
	  }

 

Examdata 부분입니다.

public static class ExamData 
	{
		public int type = 0; // 레이어종류를 구분할 변수.
		public String data0; 
		public String data1;
		public String data2;

		// byte parm_type,
		public ExamData(int parm_type, String parm_data0, String parm_data1,
				String parm_data2) {
			type = parm_type;
			data0 = parm_data0; // name
			data1 = parm_data1; // msg
			data2 = parm_data2; // time
		}
	}

 

anci (19,950 포인트) 님이 2015년 4월 20일 질문
anci님이 2015년 4월 20일 수정
String deleteDate_view1 = (String) ((TextView) view.findViewById(R.id.date_view1)).getText() ;

2개의 답변

0 추천
 
채택된 답변
쎄미 (162,410 포인트) 님이 2015년 4월 20일 답변
anci님이 2015년 4월 21일 채택됨
감사합니다 어제 확인을 못했네요 ㅎㅎ;; 참고해서 다시 해보겠습니다.(__)
0 추천
원하시는 텍스트뷰에 setTag를 안하셧으니 getTag 호출하면 null이겟죠?
중견수 (5,600 포인트) 님이 2015년 4월 20일 답변
댓글 감사합니다.
윗부분 data!=null부분에서 convertView.setTag(holder); 이전에holder.date_tv.setTag(data.data2); 이걸 추가했는데도 널익셉션이 발생합니다..
그리고 convertView가 널이 아닌 , else부분에서도 holder.date_tv.setTag(data.data2); 이렇게 추가하였습니다.
...