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

inflate를 위한 클래스를 따로 만든 경우, 리스트뷰에서 ViewHolder를 사용하는 법?

0 추천

// 일반적으로 책에서는 getView()에서 항목 뷰를 직접 inflate()해서 ViewHolder를 사용하고 있더라구요.

저는 항복 뷰를 위한 별도의 클래스를 만들고, getView에서는 이 클래스를 이용하고 있는데요.

이런 경우는 ViewHolder를 어떻게 적용해서 하는지 며칠째 해결하지 못하고 있습니다..

도와주시면 감사하겠습니다~~

 

public class MyAdapter extends BaseAdapter {

    private Context mContext;

 

    private ArrayList<SingleItemData> mItems = new ArrayList<SingleItemData>();

    public MyAdapter(Context context) { mContext = context; }

 

    public void addItem(SingleItemData item) { mItems.add(item); }

                  --생략--

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

           ViewHolder holder; // 현재 이 예제에서는 선언만 하고 이용을 못하고 있어요 ㅠㅠ

          SingleItemView singleItemView; // 이 클래스에서 inflater.inflate(R.layout.singleitemlayout, this, true); 했음.

 

          if (convertView == null) {

                 singleItemView = new SingleItemView(mContext, mItems.get(position));

          }else {

          singleItemView = (SingleItemView)convertView;

          singleItemView.setIcon(mItems.get(position).getIcon());

          singleItemView.setText(0, mItems.get(position).getData(0));

          singleItemView.setText(1, mItems.get(position).getData(1));

        }

    return singleItemView;

}

    private class ViewHolder{

        ImageView imgV;

       TextView txtGoods;

       TextView txtPrice;

    }

}

앞바퀴 (280 포인트) 님이 2019년 2월 9일 질문

1개의 답변

0 추천
 
채택된 답변
ViewHolder 패턴은 기존의 getView() 구현사항에서 findById()의 반복 호출을 줄이기 위한 패턴입니다.

첨부된 코드에서는 이미 SingleItemView에서 세부 view에 대한 직접 접근은 막고 있으니,

ViewHolder패턴을 적용할 필요도 없고 적용 할 수도 없는 상황입니다.
디자이너정 (42,810 포인트) 님이 2019년 2월 10일 답변
앞바퀴님이 2019년 2월 10일 채택됨
그럼, 효율적으로는 viewHolder를 사용한 것과 같다는 말씀이신가요?
SingleItemView 내부 로직을 알 수 없으니, 확실히 뭐라고 말씀 드릴수는 없죠.
SingleItemView 내용은 별 것 없습니다. 혹시 여기에 viewholder를 만들어 전역으로 getView()에서 사용해도 되는 건가요? 문득 이런 생각이 들어서요..
--------------------------------------------------------
public class SingleItemView extends LinearLayout {
    ImageView imgView;
    TextView textView1;
    TextView textView2;

    public SingleItemView(Context context, SingleItemData singleItemData) {
        super(context);

        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.singleitemlayout, this, true);


        imgView = (ImageView)findViewById(R.id.itemImageView);
        textView1 = (TextView)findViewById(R.id.itemTextView1);
        textView2 = (TextView)findViewById(R.id.itemTextView2);

        imgView.setImageDrawable(singleItemData.getIcon());                         
        textView1.setText(singleItemData.getData(0));
        textView2.setText(singleItemData.getData(1));
    }

    public void setIcon(Drawable icon) {
        imgView.setImageDrawable(icon);
    }

    public void setText(int index, String data)  {
        if (index == 0) {
            textView1.setText(data);
        }else if (index == 1) {
            textView2.setText(data);
        }else {
            throw new IllegalArgumentException();
        }
    }
code를 보니 holder와 같은 역할을 하네요.
그렇군요. 감사합니다~
...