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

스크롤뷰로 무한 스크롤 구현 질문드립니다.

0 추천

지금 레이아웃을 스크롤뷰안에 이미지뷰와 몇몇개를 넣고 그 아래에 리스트뷰를 통해서 게시글 10개를 어뎁터로  동적으로 생성해서 구현한 상태입니다.

이제 스크롤이 하단에 도달시 새로운 게시글 10개를 생성할려고 찾아보니 스크롤뷰에는 스크롤위치상태를 확인하는게 없어서 따로 커스텀해서 사용한다는것을 찾았고 어느분이 올린 커스텀뷰를 참고할려고합니다.

그 코드가

 package com.harex.android.util;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.ScrollView;

public class gsScrollview extends ScrollView
{
 /// 스크롤 맨 아래까지 되면 처리할 이벤트 전달용 핸들
 Handler m_hd = null ;
 /// 스크롤뷰 영역 체크하려고 두는 변수에용
 Rect m_rect ;
 
 /// 커스텀 View를 사용하려면 반드시!! 아래와 같은 (Context context, AttributeSet attrs) 를 인자로하는
 /// 생성자를 쓰셔야 합니다!!!
 public gsScrollview(Context context, AttributeSet attrs)
 {
  super(context, attrs);
  // TODO Auto-generated constructor stub
 }
 
 /// 그리기가 끝나면 체크하기 위해 오버라이드
 @Override
 protected void onDraw(Canvas canvas) {
  // TODO Auto-generated method stub
  super.onDraw(canvas);
  checkIsLocatedAtFooter( ) ; /// 여기서 그리기 끝나면 함수 콜
 
 }
 
 /// 제가 만든 사용자용 함수입니다.
 private void checkIsLocatedAtFooter()
 {
  if( m_rect == null )     /// 처음에는 Rect가 없을테니....
  {
   m_rect = new Rect( ) ;    /// new합니다.
   getLocalVisibleRect( m_rect ) ;  /// 스크롤 영역 구합니다.(저는 0,480,0,696 이던가 했네요)
   return ;       /// 그리고 걍 리턴합니다.
  }
  int oldBottom = m_rect.bottom;   /// 이전 bottom저장 이유는 맨아래인 상태에서 아래로 스크롤 했을떄 쌩까려구요
 
  getLocalVisibleRect( m_rect ) ;   /// 현재 스크롤뷰의 영역을 구합니다.
            /// 이때 스크롤 이동시켰으면 top와 bottom값이 이동한 만큼 변합니다.
  
  int height = getMeasuredHeight( ) ;  /// 스크롤 뷰의 높이를 구합니다.
 
  View v = getChildAt( 0 ) ;    /// 스크롤 뷰 안에 들어있는 내용물의 높이도 구합니다.
 
  if (oldBottom > 0 && height > 0)   /// 스크롤 뷰나 이전 bottom이 0 이상이어야만 처리
  {
   /// bottom값의 변화가 없으면 처리 안해요
   /// 그리고 현재 bottom이 내용물의 맨 아래까지 왔으면 맨 아래까지 스크롤 한겁니다.
   if (oldBottom != m_rect.bottom && m_rect.bottom == v.getMeasuredHeight( ) )
   {
    // 끝에 왔을 때의 처리
    Log.d("ghlab", "끝에 왔을 때의 처리");
   
    /// 핸들러가 처음에는 널인데 사용자가 셋팅해주면 그 핸들러로 메세지 날립니다.
    if( m_hd != null )
    {
     /// 핸들러에 이벤트 날리면 끗납니다.
     m_hd.sendEmptyMessage( 1 ) ;
    }
   }
  }
 }
 
 /// 맨 아래까지 갔을때 처리하기 위해 있는 녀석입니다.
 public void setHandler( Handler hd )
 {
  m_hd = hd ;
 }
 
}

위 코드를 활용하고 싶은데 핸들러를 어떻게 짜야될지 모르겠네요... 핸들러도 자세히 모르는 상태이기도 합니다..

첫째로  어떠한 식으로 코딩을 해야되는지 조언 부탁드립니다.

 

두번째로

없는 지식으로 핸들러 코드 하나 만들어서 핸들러쪽에서 메인엑티비티 UI변경을 해볼려고했지만 게시글은 정상적으로 불러오지만 게시글 추가도, 기존에 있던 TextView안 글자도 바뀌지가않네요.

코드는 글자수제한때문에 못올리는점 양해부탁드리고 의심되는 부분이 뭔지만 부탁드리겠습니다.

감사합니다.

 

bedz (700 포인트) 님이 2015년 10월 6일 질문

1개의 답변

0 추천
 
채택된 답변

스크롤뷰안에 리스트뷰를 넣는 방식보다는... 리스트뷰를 베이스어댑터를 이용해 커스터마이징하세요. 스크롤뷰를 안써도 리스트뷰는 자동으로 스크롤이 되도록 동작합니다. adpater를 이용해서 리스트뷰를 구현하고, 어댑터의 인자를 적당히 넣고, 변경시마다 notification 을 이용하면 매번 리스트를 새로 그릴 수 있으니, 해당 기능을 사용하세요

 

.아 잘못읽었네요. 수정합니다. 일단 리스트뷰의 현재 위치를 받아오는 방식을 취해야 할 것 같은데, 리스트뷰를 base adapter를 상속받은 adapter를 이용해서 커스텀으로 구현하게 되면, getView를 통해서 현재 포지션을 받아올 수 있습니다. getView를 통해서 그려지는 아이템이 현재 표현 가능한 가장 마지막 아이템인지를 판별하면 되겠군요.

길버트공원 (1,720 포인트) 님이 2015년 10월 7일 답변
bedz님이 2015년 10월 7일 채택됨
자력으로 해결했습니다. 그래도 답변 감사합니다.
...