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

안드로이드 ViewHolder 질문

0 추천
아래 코드는 getView 부분으로 viewHolder을 써서 구현한 부분인데..
여기서 저 눌린 해당 txt의값만 바꾸고싶은데 클릭이벤트는 먹는데 아무 반응이없습니다... 이거 어찌해야하나요
 
public View getView(int position, View convertview, ViewGroup parent){
 
if(convertview==null){
holder = new ViewHolder();
LayoutInflater li = (LayoutInflater)con.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertview=li.inflate(R.layout.cardlistview, null);
 
holder.txt = (TextView)convertview.findViewById(R.id.txt_CardNumList);
holder.txt2 = (TextView)convertview.findViewById(R.id.txt_CardUseList);
holder.img_card = (ImageView)convertview.findViewById(R.id.img_CardTypel);
holder.rl = (RelativeLayout)convertview.findViewById(R.id.lists);
holder.listViewLongClick = (ListViewLongClick)convertview.findViewById(R.id.view_View);
holder.rv = (RoundView)convertview.findViewById(R.id.view_Round);
holder.l_Layout = (LinearLayout)convertview.findViewById(R.id.layout_UseListv);
holder.l_Layout2 = (LinearLayout)convertview.findViewById(R.id.layout_CardDelv);
holder.view_Line = (View)convertview.findViewById(R.id.view_Line);
holder.backlist = (LinearLayout)convertview.findViewById(R.id.backlist);
convertview.setTag(holder);
}else{
holder = (ViewHolder)convertview.getTag();
}
holder.txt.setText(cBeanList.get(position).getCardNum());
holder.txt2.setText(cBeanList.get(position).getCardPayCount()+"");
holder.img_card.setImageResource(cBeanList.get(position).getCardType());
holder.img_card.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
holder.txt.setText("123");
}
});
 
return convertview;
}
tkadks1 (230 포인트) 님이 2015년 1월 29일 질문
TextView txt = (TextView)holder.txt.getTag((int)v.getTag());
                    Toast.makeText(con, txt.getText().toString(), Toast.LENGTH_SHORT).show();
                    txt.setText("123"); 온클릭안에 넣으면 에러나고...

1개의 답변

0 추천

아마도 holder 선언부가 getView()가 아닌 Adapter Classs Member로 선언을 하셨나보네요.

OnClick Event가 발생하는 시점은 User가 ImageView를 Click 하는 시점입니다.

getView가 실행되는 시점은 ListView가 그려지는 시점입니다. 보통 최초 생성된 직후와 Scroll 할때 호출이 됩니다.

그래서 User가 ImageView를 Click해서 OnClick Event가 발생하는 시점은 화면에 보여지는 ListItem이 모두 getView()를 통해 만들어진 후 이겠죠.

onClick()에서 holder.txt.setText("123");을 실행하도록 하셨는데요.

원하시는 동작은 Click Event가 발생한 ImageView와 같은 item에 있는 TextView에 "123"을 출력하시는 걸로 보입니다.

그러기 위해서는 onClick Event가 발생했을 때 Event가 발생한 Item의 TextView 객체의 참조를 알아 내야 합니다.

지금 구현되어 있는 코드에서 onClick()의 holder.txt는 ListView 화면에 보여지는 Item을 모두 생성하기 위해 getView()가 실행되는데 마지막 getView()가 실행되면서 생성된 TextView 일 것입니다. 아마도 ListView 마지막에 있는 Item이나 화면에 가려서 아직 안보이는 아래에 있는 Item의 TextView로 생각이 되네요. 그러니 ImageView를 Click해도 원하는 위치의 TextView의 Text가 변경되지 않는 것입니다.

 

해결을 위해 OnClick Event를 받을 때 Parameter로 View 객체를 받습니다.

이 View는 Event가 발생한 객체로 여기에서는 ImageView 객체 입니다.

Event를 받는 ImageView 객체한테 OnClick Event를 받으면 Update 할 TextView 객체를 미리 알려 주면 됩니다.

Object들은 setTag를 통해 Object를 가지고 있을 수 있습니다.

그래서 아래처럼 img_card와 txt의 참조를 얻은 시점에

holder.txt = (TextView)convertview.findViewById(R.id.txt_CardNumList);
holder.txt2 = (TextView)convertview.findViewById(R.id.txt_CardUseList);
holder.img_card = (ImageView)convertview.findViewById(R.id.img_CardTypel);

아래와 같이 img_card에 txt를 Tag로 설정해 두고

holder.img_card.setTag(holder.txt);

onClick Event가 발생하면 Parameter로 받는 View (img_card가 Event를 받으니 Event가 발생한 img_card의 참조입니다.)에서 getTag를 가져와 update를 하면 됩니다.

TextView txt = (TextView)v.getTag();

txt.setText("123");

 

이렇게 하면 될껍니다. ㅎㅎㅎ

저도 한번 해봐야 겠네요.

RealReNO (140 포인트) 님이 2015년 1월 29일 답변
감사합니다!! 덕분에 해결되었어요..
추천을 할려니까 자꼬 로그인 하라네요;;.
...