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

리스트뷰 사진 로딩 지연 문제 입니다...

0 추천
public class CustomAdapter extends BaseAdapter
{
    private static final String LOG = "CustomAdapter";
    private LayoutInflater mInflater;
    private ArrayList<dataST> mRowList;
    private int resourceLayoutId;
    private AsyncTask < Void , Void, Bitmap >  aTask;
    private  static Context m_ctx;

 

    public CustomAdapter(Context context, int textViewResourceId, ArrayList<dataST> rowList)
    {
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        resourceLayoutId = textViewResourceId;
        mRowList = rowList;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        holder hold;
        if(convertView == null)
        {
            convertView = mInflater.inflate(resourceLayoutId, parent, false);

            hold = new holder();
            hold.imagee = (ImageView)convertView.findViewById(R.id.imagee0);
          hold.textt0 = (TextView)convertView.findViewById(R.id.textt0);
          hold.textt1 = (TextView)convertView.findViewById(R.id.textt1);
            hold.textt2 = (TextView)convertView.findViewById(R.id.textt2);
            hold.textt3 = (TextView)convertView.findViewById(R.id.textt3);

            hold.editt0 = (EditText)convertView.findViewById(R.id.editt0);
            hold.editt1  = (EditText)convertView.findViewById(R.id.editt1);
            hold.editt2  = (EditText)convertView.findViewById(R.id.editt2);
            hold.editt3  = (EditText)convertView.findViewById(R.id.editt3);
            hold.editt4  = (EditText)convertView.findViewById(R.id.editt4);
            convertView.setTag(hold);

        }else {
            hold = (holder)convertView.getTag();
        }

       /* TextView tvTextLabel = (TextView) convertView.findViewById(R.id.textLabel);
        tvTextLabel.setText(mRowList.get(position));*/
        hold.position = position;
        aTask = new asyncTask(position , hold , m_ctx);
        aTask.execute();

        return convertView;
    }
    private class asyncTask extends AsyncTask<Void , Void, Bitmap >{
        int mPosi;
        holder mhold;
        dataST datast;
        public asyncTask(int position, holder hold, Context context){
            mPosi = position;
            mhold = hold;
            Log.i("astncTask", "생성자");
        }

        protected void onPreExecute(){
            super.onPreExecute();
            datast = mRowList.get(mPosi);
            Log.i("astncTask", "onPreExecute");
        }
        @Override
        protected Bitmap doInBackground(Void... params) {
            Bitmap bm = null;
            String imPath = datast.imgurl;
            bm = urlToBitmap(imPath);
            Log.i("astncTask", imPath);
            Log.i("astncTask", "dolnBackground");
            return bm;

        }

        protected void onPostExecute(Bitmap bm){
            if(mhold.position == mPosi){
                    if(bm != null){
                        mhold.imagee.setImageBitmap(bm);
                    }else {
                        mhold.imagee.setImageDrawable(null);
                    }

                mhold.editt0.setText(datast.height);
                mhold.editt1.setText(datast.weight);
                mhold.editt2.setText(datast.head);
                mhold.editt3.setText(datast.memo);
                // editt4.setText(new String(datast.imgurl));
                mhold.editt4.setText(datast.date);

                Log.i("astncTask", "onPostExecute");
            }
        }

 

    }

    private  static class holder{
        public ImageView imagee;
       public TextView textt0, textt1, textt2, textt3 ;
       public EditText editt0, editt1, editt2, editt3, editt4 ;

        public int position;

    }

  public Bitmap urlToBitmap(String String)  {

        BitmapFactory.Options resize = new BitmapFactory.Options();
        resize.inSampleSize = 4;
        Bitmap bitmap = BitmapFactory.decodeFile(String, resize);

        return bitmap;
    }

    @Override
    public int getCount()
    {
        return mRowList.size();
    }

    @Override
    public Object getItem(int position)
    {
        return mRowList.get(position);
    }

    @Override
    public long getItemId(int position)
    {
        return position;
    }
}

 

어댑터 부분 전체 코딩입니다. 자료는 SQLite 에 저장되어 있는 정보를 이용하구요.

사진 부분은 SQLite 에 폰 갤러리 경로를 저장하고 그 경로를 가지고 리사이즈후 셋팅하는 구조입니다.

AsyncTask를 사용하지 않았을시에 심한 버벅임 문제가 있어서 AsyncTask를 사용하는 쪽으로 코드를 바꾸었습니다.

이후엔 버벅임 현상은 사라졌지만 스크롤시 사진이 스크롤전의 사진이 보였다가 정상 사진으로 셋팅되는 문제가 있습니다...

스크롤을 빠르게 할 수록 더 심해졌습니다...

원본사진을 이미지뷰에 셋팅시에 리사이징 후 셋팅 하기때문에 이런 문제가 발생하는 건가요..?

처음 로딩시 이미지뷰에 셋팅을 하고 스크롤시에도 다시 셋팅하지 않고 그대로 두는 방법이 있을까요....

도와주세요....ㅜ
vldmlzkf (120 포인트) 님이 2016년 6월 2일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...