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

listactivity getview..고수님들 힌트좀....

0 추천

안녕하세요 안드로이드 초보프로그래머입니다..

일단 소스부터 보시죠..필요한 부분만 붙여넣겟습니다.

 

listvie adapter getview

@Override
 public View getView(int position, View convertView, ViewGroup parent) {
  // TODO Auto-generated method stub
  
  try{
   if (convertView == null)  {
    convertView = View.inflate(conn, R.layout.diary_listview, null);
   }
   
   if(null != convertView){
    convertView.setTag(position);
    iv_diaryimg = (ImageView)convertView.findViewById(R.id.iv_diaryimg);
    iv_diaryimg.setImageResource(R.drawable.ic_launcher);
    tv_diary_id = (TextView)convertView.findViewById(R.id.tv_diary_id);
    tv_diary_date = (TextView)convertView.findViewById(R.id.tv_diary_date);
    tv_diary_content = (TextView)convertView.findViewById(R.id.tv_diary_content);
    
    JSONObject ob = mjsonarr.getJSONObject(position);
    new DownLoadimage(iv_diaryimg,position).execute(ob.get("board_imgpath").toString());
    
    tv_diary_id.setText(ob.get("membership_id").toString());
    tv_diary_date.setText(ob.get("board_date").toString());
    tv_diary_content.setText(ob.get("board_content").toString());
    convertView.setOnClickListener(this);
   }
  }catch (Exception e) {
   // TODO: handle exception
   Log.d("ErrorLog", "ImageAdapter GetView : " + e.toString());
  }
  
  return convertView;
 }

 

AsyncTask

 

//이미지 bitmap로드
 class DownLoadimage extends AsyncTask<String, Void, Bitmap>{

  private ImageView m_vimg;
  private int po;
  
  public DownLoadimage(ImageView v_img, int position) {
   // TODO Auto-generated constructor stub
   m_vimg = v_img;
   po = position;
  }
  @Override
  protected Bitmap doInBackground(String... urls) {
   // TODO Auto-generated method stub
   String url = urls[0];
   Bitmap imgbitmap = null;
   try{
    InputStream in = new URL(url).openStream();
    imgbitmap = BitmapFactory.decodeStream(in);
   }catch (Exception e) {
    // TODO: handle exception
    Log.d("ErrorLog", "DiaryListViewAdapter : DownLoadimage = " + e.toString());
   }
   
   arrbitmap[po] = imgbitmap;
   return imgbitmap;
  }
   @Override
  protected void onPostExecute(Bitmap result) {
   // TODO Auto-generated method stub
   m_vimg.setImageBitmap(result);
  }
 }

이렇게 되어 있구요

 

R.layout.diary_listview xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#808080"
    android:orientation="vertical" >
    
    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >
        <TextView 
         android:id="@+id/tv_diary_id"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginLeft="10dp"
         android:textSize="20dp"
        />
        <TextView 
         android:id="@+id/tv_diary_date"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_marginLeft="10dp"
         android:gravity="right"
        />
    </LinearLayout>
    
    <LinearLayout 
        android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:layout_marginBottom="50dp"
     android:orientation="vertical"
        >
         <TextView 
            android:id="@+id/tv_diary_content"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
            />
        <ImageView
            android:id="@+id/iv_diaryimg" 
            android:layout_width="300dp"
         android:layout_height="300dp"
         android:layout_gravity="center"
            />
    </LinearLayout>
</LinearLayout>

이렇게 코딩하엿습니다 현재 카카오스토리처럼 리스트뷰 어뎁터를 사용해서 커스텀 하구 있는 중인데요..

막히는 부분이.. 지금 스크롤을 천천히 하게 되면 AsyncTask가 천천히 호출되면서 서버에서 이미지를 잘 불러와

해당위치에 잘 출력됩니다.

하지만 빠른 스크롤시;;;; getview position이 계속 유동적으로 빨리 바뀌다보니 AsyncTask를 계속 호출해서

원하는 위치에 이미지가 제대로 출력되지 않습니다 제 생각인데 position 이 바뀌면서 계속 이미지를 불러오는 과정에서

생기는 부분같은데요 원하는 위치에 제대로 출력이 아예 되지 않는것은 아니구요

이미지들이 로드 되어 쌓여 잇다가 스크롤이 완료되는 시점에 계속 이미지가 바뀌면서 마지막엔 제대로 된 이미지를 덮어

쓰는것 같습니다.. 이걸 어떤방식으로 해결해야 할지.. 힌트좀 주시면 감사하겠습니다..

횡설수설.. 질문을 제대로 했는지 모르겠네요 질문이 있으시면 댓글달아주시면 바로 대답해드리겠습니다

실시간으로 확인합니다 감사합니다.

 

mamongs (4,050 포인트) 님이 2013년 6월 5일 질문

4개의 답변

0 추천
어뎁터 부분이 잘못 되어있는것으로 보이네요~~~!

아이템에 데이터를 넣는 부분을 이프문 밖 뷰를 리턴 하기 직전에 해줘 보세요~~~!
ThisPlus (46,920 포인트) 님이 2013년 6월 5일 답변
JSONObject ob = mjsonarr.getJSONObject(position);    new DownLoadimage(iv_diaryimg,position).execute(ob.get("board_imgpath").toString());         tv_diary_id.setText(ob.get("membership_id").toString());    tv_diary_date.setText(ob.get("board_date").toString());    tv_diary_content.setText(ob.get("board_content").toString());    convertView.setOnClickListener(this);

이부분 말씀인가요??
0 추천
굳이 스크롤을 할때 async를 구현 하셔야하는지요? 과부하가 많이 걸릴듯하구요..

카카오스토리 같은 경우는 일정한 갯수를 받아온 후에 셋팅하고, 더 이상 글이 없을 경우 reload 합니다만...

서버를 최대한 안가는 방향으로 구현을 하셔야 할듯합니다.

사진같은 경우는 용량도 크고 불러오는 시간도 시간을 많이 지체하는 작업이기때문에, 스크롤에 이벤트를 처리하시면,

폰도 서버도 과부하가 걸릴 듯 하네요.. 일정한 갯수를 불러오고 스크롤이 맨밑에 내려갔을때 서버를 다시 다녀오는 방법이

어떨지 제 생각압니다.
안드로메다개발자 (8,830 포인트) 님이 2013년 6월 5일 답변
0 추천

http://blog.naver.com/PostView.nhn?blogId=huewu&logNo=110090363656

요고 하고싶으신거죠 ?

백그라운드로 동시 다발적으로 이미지를 각 쓰레드를 생성해서 가져오되

제자리로 쏙쏙 받아오는 순서대로 들어가는거요..

코드를 보니 캐시 처리가 빠져서 getView 요청할때마다 네트워크를 태워서 그런걸로 보입니다.

이미 요청한 데이터는 다시 요청하지 않도록 캐시처리를..

 

물론 이미 받아온 데이터는 다시 요청하지 않도록 하시는것도 잊지 마시구요..

위에 링크 보시면 답이 모두 나와있으니 고민하시다가 안되면 보세요

블랙넥원 (9,600 포인트) 님이 2013년 6월 5일 답변
네 정확하게 이해하고 계시네요 ㅠㅠ
마지막엔 제자리로 돌아가긴 하던데.. 캐시처리라는게;;
뭔지 잘 몰라서;감사합니다 ㅜ 관심갖어주셔서!!
캐시처리 ;찾아서해볼게요;
0 추천
값을 어레이로 담고 담을때 이미지 리소스 채로 담고 담은값을 셋어뎁터해줘보세요
열심히잘할게요 (1,260 포인트) 님이 2013년 6월 5일 답변
...