마스터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 포인트) 님이 2월 9일 질문

2개의 답변

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

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

ViewHolder패턴을 적용할 필요도 없고 적용 할 수도 없는 상황입니다.
디자이너정 (36,090 포인트) 님이 2월 10일 답변
앞바퀴님이 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와 같은 역할을 하네요.
그렇군요. 감사합니다~
0 추천

I regularly visit your site and find a lot of interesting information. 
Not only good posts but also great comments. 
Thank you and look forward to your page growing stronger.

angry birds

funnyjokes (180 포인트) 님이 2월 11일 답변
...