반응형

#안드로이드 viewHolder 구현하기 https://developer.android.com/training/improving-layouts/smooth-scrolling.html#ViewHolder



static class ViewHolder {

TextView text;

TextView timestamp;

ImageView icon;

ProgressBar progress;

int position;

}


ViewHolder holder = new ViewHolder();

holder.icon = (ImageView) convertView.findViewById(R.id.listitem_image);

holder.text = (TextView) convertView.findViewById(R.id.listitem_text);

holder.timestamp = (TextView) convertView.findViewById(R.id.listitem_timestamp);

holder.progress = (ProgressBar) convertView.findViewById(R.id.progress_spinner);

convertView.setTag(holder);



적용전)

.......................

    /**

     * 어뎁터의 뷰를 구현하는 함수

     * @param position -- 행의 index를 의미

     * @param convertView -- 행 전체를 나타내는 뷰를 의미

     * @param parent -- 어댑터를 가지고 있는 부모의 뷰를 의미

     * @return

     */

    @Override

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

        final Context context = parent.getContext();

        View v = convertView;

        PersonViewHolder viewHolder;

        // getView에서 넘어오는 convertView는 이전에 그려졌던 view를 넘기는데요.

        // 한번도 inflate되지 않은 view라면 null로 전달되는 경우가 있으니 반드시 null체크는 해야합니다.

        if (v == null) {

            Log.e("Toggle Track:", "=========== 새로 그려지는 중입니다. ===========");

            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

           v = inflater.inflate(R.layout.activity_assem_item, parent, false);

        }// 캐시된 뷰가 있을 경우 저장된 뷰홀더를 사용한다

        else

        {

            v = (PersonViewHolder) convertView.getTag();

        }

        // Data Set(assemblyItemList)에서 position에 위치한 데이터 획득

        final AssemBean listViewItem = assemblyItemList.get(position);

        // 화면에 표시될 View(Layout이 inflate된)으로부터 위젯에 대한 데이터 획득

        ImageView imgView = (ImageView) v.findViewById(R.id.assem_empImg);

        TextView empNmView = (TextView) v.findViewById(R.id.assem_empNm);

        TextView origNmView = (TextView) v.findViewById(R.id.assem_origNm);

        ToggleButton favoriteBtn = (ToggleButton) v.findViewById(R.id.favorite); // 즐겨찾기 추가

        final TextView colorView = (TextView) v.findViewById(R.id.color); // 정당 색깔


        // 각 위젯에 데이터 반영

        Picasso.with(context).load(listViewItem.getJpgLink()).into(imgView);

        empNmView.setText(listViewItem.getEmpNm());

        origNmView.setText(listViewItem.getOrigNm());

        // 정당 색깔 구분

        colorView.setBackgroundColor(Color.rgb(128, 128, 128));

        if(listViewItem.getEmpNm().contains("강")) {

            colorView.setBackgroundColor(Color.rgb(255, 0, 0));

        }

        // 즐겨찾기 이미지 설정

        favoriteBtn.setBackgroundResource(R.drawable.imgbtn_defalut);

        if(listViewItem.getFavorite()){

            favoriteBtn.setBackgroundResource(R.drawable.imgbtn_focused);

        }


        .......................

        return v;

    }}


적용후)


..................


    /**
     * 어뎁터의 뷰를 구현하는 함수
     * @param position      -- 행의 index 의미
     * @param convertView   -- 전체를 나타내는 뷰를 의미
     * @param parent         -- 어댑터를 가지고 있는 부모의 뷰를 의미
     * @return
     */
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {


        final Context context = parent.getContext();

        View v = convertView;

        final ViewHolder viewHolder;


        // getView에서 넘어오는 convertView 이전에 그려졌던 view 넘기는데요.
        // 한번도 inflate되지 않은 view라면 null 전달되는 경우가 있으니 반드시 null체크는 해야합니다.
        if (v == null) {

            Log.e("Toggle Track:", "=========== 새로 그려지는 중입니다===========");

            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            v = inflater.inflate(R.layout.activity_assem_item, parent, false);


            // 화면에 표시될 View(Layout inflate)으로부터 위젯에 대한 데이터 획득

            viewHolder = new ViewHolder();

            viewHolder.imgView = (ImageView) v.findViewById(R.id.assem_empImg);

            viewHolder.empNmView = (TextView) v.findViewById(R.id.assem_empNm);

            viewHolder.origNmView = (TextView) v.findViewById(R.id.assem_origNm);

            viewHolder.favoriteBtn = (ToggleButton) v.findViewById(R.id.favorite);

            viewHolder.colorView = (TextView) v.findViewById(R.id.color);

            v.setTag(viewHolder);

        }

        // 캐시된 뷰가 있을 경우 저장된 뷰홀더를 사용

        else{

            viewHolder = (ViewHolder) v.getTag();

        }


        // Data Set(assemblyItemList)에서 position 위치한 데이터 획득

        final AssemBean listViewItem = assemblyItemList.get(position);

        if(listViewItem != null){


            // 위젯에 데이터 반영
            Picasso.with(context).load(listViewItem.getJpgLink()).into(viewHolder.imgView);

            viewHolder.empNmView.setText(listViewItem.getEmpNm());

            viewHolder.origNmView.setText(listViewItem.getOrigNm());


            // 정당 색깔 구분
            viewHolder.colorView.setBackgroundColor(Color.rgb(128, 128, 128));

            if(listViewItem.getEmpNm().contains("")) {

                viewHolder.colorView.setBackgroundColor(Color.rgb(255, 0, 0));

            }


            // 즐겨찾기 이미지 설정
            viewHolder.favoriteBtn.setBackgroundResource(R.drawable.imgbtn_defalut);

            if(listViewItem.getFavorite()){

                viewHolder.favoriteBtn.setBackgroundResource(R.drawable.imgbtn_focused);

            }


            ....................


        return v;

    }


    public class ViewHolder

    {

        public int number;

        ImageView imgView;

        TextView empNmView;

        TextView origNmView;

        ToggleButton favoriteBtn;

        TextView colorView;

    }

}



참고 링크


+ Recent posts