본문 바로가기

프로그래밍/안드로이드

[안드로이드 팁] 안드로이드 ListView 이벤트 추가 팁

[안드로이드 팁] 안드로이드 ListView 이벤트 추가 팁

ListView를 간간히 자주 사용을 하게 되다보니 이런저런 문제점이 자주 발생하게 되는데요.이번에 발생된 문제점은 ListView를 한줄짜리가 아닌 내가 원하는 모양대로 구성하기 위하여 소위 Custom ListView를 만들려고 하다가 문제점이 발생하더군요.

기본적으로 ArrayAdapter를 상속받는 클래스를 만들어 getView(int, View, ViewGroup)를 오버라이딩 하여 구성하게 됩니다.
아래의 코드를 보면서 진행하겠습니다.

public View getView(int position, View convertView, ViewGroup parent){
  View v = convertView;
  if(v == null){
        LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.list_row_layout, null);
  }

  TextView t1 = (TextView)v.findViewById(R.id.row01);
  TextView t2 = (TextView)v.findViewById(R.id.row02);
......................  여타 기타 코드
}


보통 웹상의 코드는 위와 같은 형태로 되어 있습니다. 근데 제가 만든 플밍에서는 convertView가 null 이 아닌경우가 무쟈게 발생하게 됩니다.(저만 그럴수도 있습니다.)

그러다 보니 하위 코드에서 list_row_layout.xml 에서 작성하여 만든 View들이 모두 Null로 가끔 뜨더군요.

그리하여 찾다가 해결한 방법은 View 클래스를 따로 만들어 관리를 하니 해결이 되었습니다.

public class MyRowView extends LinearLayout{

  TextView t1;
  TextView t2;
  public MyRowView(Context context, MyBean bean){
      LayoutInflater inflater = (LayoutInflater) context.getSystemService
                                                                   (Context.LAYOUT_INFLATER_SERVICE);  
      inflater.inflate(R.layout.myinfo_all_row, this, true);  
      t1 = (TextView)v.findViewById(R.id.row01);
      t2 = (TextView)v.findViewById(R.id.row02);
    
      setData(bean);
  }

  public void setData(MyBean bean){
      t1.setText(bean.getName());
      t2.setText(bean.getPhone());
  }

}


위와 같은 코드를 따로 만들어 둡니다.(import는 추가하셔야 합니다.^^)
그후 getView안의 코드를 아래와 같이 수정해 줍니다.
      @Override
      public View getView(int position, View convertView, ViewGroup parent) {
          MyRowView itemView;
          
          if(convertView == null){
              itemView = new MyRowView (context, items.get(position));
          }else{
              itemView = (MyRowView )convertView;
              itemView.setData(items.get(position));
          }
                
          return itemView;
      }

이러한 형태로 작성을 하니 완성이 되더군요..

궁금하신건 댓글을 달아주세요.

글재주가 없어서 보시는 분들한테 너무 미안한 마음이 듭니다.