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

리스트뷰에서 전화버튼 클릭하면 오류가 뜹니다 ㅡㅜ

0 추천

Insur_Adapter.java

public View getView(int position, View convertView, ViewGroup parent) {

View v = convertView;

if (v == null) {
v = inflater.inflate(R.layout.insur_consul_list, parent, false);

ImageView imagep = (ImageView) v.findViewById(R.id.image_per);
ImageView imagec = (ImageView) v.findViewById(R.id.image_comp);
TextView textn = (TextView) v.findViewById(R.id.text_name);

imagep.setImageResource(arrData.get(position).getImage_per());
imagec.setImageResource(arrData.get(position).getImage_comp());
textn.setText(arrData.get(position).getText_name());

ImageButton call = (ImageButton) v.findViewById(R.id.consul_call);

call.setTag(position);

call.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
int position = Integer.parseInt((v.getTag().toString()));
Insur_Data p = arrData.get(position);
if (p != null) {

Intent i = new Intent(Intent.ACTION_DIAL, Uri
.parse("tel:" + p.getText_call()));
Consul_Adapter.this.context.startActivity(i);
}
}
});
}
return v;
}

위는 Insur_Adapter.java 내용입니다.

 

아래 Insur_Data.java 에서 String t_call의 전화번호를 받아와서 전화거는 버튼을 만들고 있는데

버튼을 클릭하면 오류로 꺼져버립니다. ㅡㅜ

벌써 몇일째 해결방법을 찾고 있는데...

logcat 내용을 보니 29번줄이 문제라고 하는데 어디가 잘못 된건지 고수님들의 도움을 부탁드립니다.ㅡㅜ

  

 

Insur_Data.java 입니다.

 public class Insur_Data {
private int image_per;
private int image_comp;
private String text_name;
private String text_call;
private String text_mail;

public Insur_Data(int i_per, int i_comp, String t_name, String t_call, String t_mail) {
this.image_per = i_per;
this.image_comp = i_comp;
this.text_name = t_name;
this.text_call = t_call;
this.text_mail = t_mail;
}

public int getImage_per() {
return image_per;
}
public int getImage_comp() {
return image_comp;
}
public String getText_name() {
return text_name;
}
public String getText_call() {
return text_call;
}
public String getText_mail() {
return text_mail;
}

}

 

리스트뷰의 데이터는 아래에 저장되어 있습니다.

 public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.insur_consul);

// 리스트에 보여줄 데이터를 세팅한다.
setData();
// 어댑터 생성
adapter = new Consul_Adapter(this, arrData);
// 리스트뷰에 어댑터 연결
list = (ListView) findViewById(R.id.consul_list);
list.setAdapter(adapter);


private void setData() {
arrData = new ArrayList<Insur_Data>();
arrData.add(new Insur_Data(R.drawable.c_01,R.drawable.i_01, "홍길동","0101234567","12@naver.com"));
arrData.add(new Insur_Data(R.drawable.c_02,R.drawable.i_02, "김길동","0101234567","12@nate.com"));
arrData.add(new Insur_Data(R.drawable.c_03,R.drawable.i_03, "이길동","0101234567","12@hanmail.net"));
arrData.add(new Insur_Data(R.drawable.c_04, R.drawable.i_04, null,null,null));
arrData.add(new Insur_Data(R.drawable.c_04, R.drawable.i_04, null,null,null));
arrData.add(new Insur_Data(R.drawable.c_04, R.drawable.i_04, null,null,null));
arrData.add(new Insur_Data(R.drawable.c_04, R.drawable.i_04, null,null,null));
arrData.add(new Insur_Data(R.drawable.c_04, R.drawable.i_04, null,null,null));
}
}

 

동네영웅 (220 포인트) 님이 2013년 6월 26일 질문

3개의 답변

0 추천
로그캣 화면도 올려주시면 어떤 문제인지 파악이 좀더 나을것같은데요^^
안드로메다개발자 (8,830 포인트) 님이 2013년 6월 26일 답변
0 추천
getView 에서 v == null 일 경우에만 값이 존재합니다. 이는 리스트 뷰 자체를 아직 이해를 못하고 계시는 것 입니다.
aucd29 (218,390 포인트) 님이 2013년 6월 26일 답변
0 추천

Insur_Adapter.java 에 18 line 에 보면,

call.setTag(position);

위와 같은 루틴이 있는데요..

해당 루틴이 if ( v == null ) 분기문에 걸려서, 매번 갱신이 되지 않을 수 있습니다.

최초 v object가 null 일때만 세팅되고, 이후 view 의 재사용 시에 position 세팅이 잘안될 가능성이 있습니다.

 

aucd29님 말처럼, adpater 구조에 대해서 명확하게 이해를 하고 코드를 만드신 것 같지 않네요...

익명사용자 님이 2013년 6월 26일 답변
...