programing

안드로이드 엔드리스 목록

skycolor 2023. 4. 22. 09:11
반응형

안드로이드 엔드리스 목록

목록 끝에 도달하면 더 많은 항목을 로드할 수 있도록 알림을 받는 목록을 작성하려면 어떻게 해야 합니까?

1가지 해결책은 를 구현하고 (항목 추가 등)를 편리한 상태로 변경하는 것입니다.onScroll★★★★★★ 。

와 같다ListActivity에 40부터 시작하는 정수 목록을 나타냅니다.사용자가 목록 끝까지 스크롤할 때 항목을 추가합니다.

public class Test extends ListActivity implements OnScrollListener {

    Aleph0 adapter = new Aleph0();

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setListAdapter(adapter); 
        getListView().setOnScrollListener(this);
    }

    public void onScroll(AbsListView view,
        int firstVisible, int visibleCount, int totalCount) {

        boolean loadMore = /* maybe add a padding */
            firstVisible + visibleCount >= totalCount;

        if(loadMore) {
            adapter.count += visibleCount; // or any other amount
            adapter.notifyDataSetChanged();
        }
    }

    public void onScrollStateChanged(AbsListView v, int s) { }    

    class Aleph0 extends BaseAdapter {
        int count = 40; /* starting amount */

        public int getCount() { return count; }
        public Object getItem(int pos) { return pos; }
        public long getItemId(int pos) { return pos; }

        public View getView(int pos, View v, ViewGroup p) {
                TextView view = new TextView(Test.this);
                view.setText("entry " + pos);
                return view;
        }
    }
}

웹 데이터 로드와 같은 장시간 실행 작업에는 별도의 스레드를 사용해야 하며 마지막 목록 항목(마켓 또는 gmail 앱 등)에 진행 상황을 나타낼 수도 있습니다.

내 앱에 사용한 솔루션에 기여하고 싶었을 뿐입니다.

, 이 글자는 '아', '아', '아', '아', '아', '아', '아', '아', '아', '아',OnScrollListener단, 스크롤 조작 중에는 표시/총 카운트 계산이 전혀 실행되지 않기 때문에 로우엔드 디바이스에서 스크롤 성능이 훨씬 우수하다는 것을 알 수 있습니다.

  1. 의 ★★★를 빌려주세요.ListFragment ★★★★★★★★★★★★★★★★★」ListActivityOnScrollListener
  2. 다음 메서드를 해당 클래스에 추가합니다.

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        //leave this empty
    }
    
    @Override
    public void onScrollStateChanged(AbsListView listView, int scrollState) {
        if (scrollState == SCROLL_STATE_IDLE) {
            if (listView.getLastVisiblePosition() >= listView.getCount() - 1 - threshold) {
                currentPage++;
                //load more list items:
                loadElements(currentPage);
            }
        }
    }
    

    서 ''는currentPage해야 하는 또, 「데이터 소스」의 페이지입니다.threshold는 로드 프로세스를 트리거하는 목록 항목의 수(끝에서 제외)입니다.「 」를 설정했을 threshold로로 합니다.0예를 들어 사용자는 더 많은 항목을 로드하기 위해 목록의 맨 끝으로 스크롤해야 합니다.

  3. (옵션)보다시피 "load-more check"는 사용자가 스크롤을 정지했을 때만 호출됩니다.조작성을 향상시키려면 , 다음의 순서로 리스트의 마지막에 로드 인디케이터를 부풀려 추가할 수 있습니다.listView.addFooterView(yourFooterView)의 한 예: 이러한 바닥글 뷰의 한 가지 예는 다음과 같습니다.

    <?xml version="1.0" encoding="utf-8"?>
    
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/footer_layout"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:padding="10dp" >
    
        <ProgressBar
            android:id="@+id/progressBar1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_gravity="center_vertical" />
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_toRightOf="@+id/progressBar1"
            android:padding="5dp"
            android:text="@string/loading_text" />
    
    </RelativeLayout>
    
  4. (옵션) 마지막으로 호출하여 로드 인디케이터를 삭제합니다.listView.removeFooterView(yourFooterView)항목 또는 페이지가 더 이상 없는 경우

onScrollListener를 사용하여 목록의 끝을 검출할 수 있습니다.작업 코드는 다음과 같습니다.

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
    if (view.getAdapter() != null && ((firstVisibleItem + visibleItemCount) >= totalItemCount) && totalItemCount != mPrevTotalItemCount) {
        Log.v(TAG, "onListEnd, extending list");
        mPrevTotalItemCount = totalItemCount;
        mAdapter.addMoreData();
    }
}

또 다른 방법(어댑터 내부)은 다음과 같습니다.

    public View getView(int pos, View v, ViewGroup p) {
            if(pos==getCount()-1){
                addMoreData(); //should be asynctask or thread
            }
            return view;
    }

번 하여 여러 의 콜을 .addMoreData().

목록에 모든 요소를 추가할 경우 어댑터 내의 notifyDataSetChanged()를 호출하여 View를 업데이트하십시오(UI 스레드 - runOnUiThread).

심플하고 효과적인 솔루션을 찾았습니다!

Android 앱용 네트워킹을 보다 쉽고 빠르게 사용할 수 있습니다.Balley는 열려 있는 AOSP 저장소를 통해 사용할 수 있습니다.

지정된 코드는 다음을 나타냅니다.

  1. ListView: HTTP 페이지 지정 요구에 의해 입력됩니다.
  2. Network Image View 사용 현황.
  3. 미리 읽기 기능이 있는 "Endless" List View 페이지 번호 지정.

미래의 일관성을 위해 는 Bankov의 보고서를 갈랐다.

또한 List View의 마지막에 로드 뷰를 쉽게 표시할 수 있는 솔루션이 있습니다.

클래스는 다음 URL에서 볼 수 있습니다.

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/helper/ListViewWithLoadingIndicatorHelper.java - SimpleListViewWithLoading에서 확장하지 않고 기능을 사용할 수 있도록 하는 도우미인디케이터

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/listener/EndlessScrollListener.java - 사용자가 ListView 하단에 도달하려고 할 때 데이터 로드를 시작하는 리스너.

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/view/SimpleListViewWithLoadingIndicator.java - Endless List View 。이 클래스는 직접 사용할 수도 있고 확장할 수도 있습니다.

조금 늦을 수도 있지만, 다음과 같은 해결책이 제 경우 매우 유용하게 사용되었습니다.에 ListView를 입니다.Footer을 위해 하다.addOnLayoutChangeListener.

http://developer.android.com/reference/android/widget/ListView.html#addFooterView(android.view.View)

예를 들어 다음과 같습니다.

ListView listView1 = (ListView) v.findViewById(R.id.dialogsList); // Your listView
View loadMoreView = getActivity().getLayoutInflater().inflate(R.layout.list_load_more, null); // Getting your layout of FooterView, which will always be at the bottom of your listview. E.g. you may place on it the ProgressBar or leave it empty-layout.
listView1.addFooterView(loadMoreView); // Adding your View to your listview 

...

loadMoreView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
    @Override
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
         Log.d("Hey!", "Your list has reached bottom");
    }
});

이 이벤트는 바닥글이 보일 때 한 번 작동하여 마법처럼 작동합니다.

이 문제의 핵심은 load-more 이벤트를 검출하고 데이터에 대한 비동기 요구를 시작한 후 목록을 업데이트하는 것입니다.또한 로드 인디케이터 및 기타 장식기가 있는 어댑터가 필요합니다.사실, 어떤 코너 케이스에서는 문제가 매우 복잡합니다....OnScrollListener이치노항목이 화면을 채우지 않는 경우가 있기 때문입니다.

RecyclerView또한 비동기 로더 구현도 제공합니다.AutoPagerFragment여러 페이지 소스에서 데이터를 쉽게 가져올 수 있습니다.원하는 페이지를 로딩할 수 있습니다.RecyclerView커스텀 이벤트뿐만 아니라 다음 페이지도 마찬가지입니다.

주소는 https://github.com/SphiaTower/AutoPagerRecyclerManager 입니다.

지금까지 본 최고의 솔루션은 FastAdapter 라이브러리에 있는 재활용 도구 뷰입니다.이 있습니다.

다음은 사용 예를 제시하겠습니다.Endless Scroll List 액티비티

내가 그것을 끝없는 스크롤 리스트에 사용했을 때, 나는 그 설정이 매우 견고하다는 것을 깨달았다.나는 그것을 꼭 추천하고 싶다.

이와 매우 유사한 다른 솔루션에서 작업해 왔습니다만,footerView더할 수 하려면 을 하십시오.footerView''메뉴'를ListView는 부모 보기 맨 '메뉴'가 있어요.ListView이 때, 이, 이, 이, 이, 이, 이, 이, 이, 이listView아이돌 다시 을 하면 가 종료됩니다.스크롤 상태가 아이돌 상태일 때는 메뉴가 다시 표시되지만 사용자가 스크롤을 하면 메뉴가 종료됩니다.listView는 '물어보고 물어봅니다footerView되지 않고 는 이 를 볼 수 있습니다.footerView더 많은 콘텐츠를 로드합니다.을 사용하다

안부 전해요.

listView.setOnScrollListener(new OnScrollListener() {

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        // TODO Auto-generated method stub
        if(scrollState == SCROLL_STATE_IDLE) {
            if(footerView.isShown()) {
                bottomView.setVisibility(LinearLayout.INVISIBLE);
            } else {
                bottomView.setVisibility(LinearLayout.VISIBLE);
            } else {
                bottomView.setVisibility(LinearLayout.INVISIBLE);
            }
        }
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {

    }
});

오래된 질문이고 Android 세계는 대부분 RecycleerViews로 넘어갔지만 관심 있는 사람이라면 이 라이브러리가 매우 흥미롭다는 것을 알게 될 것입니다.

ListView에서 사용되는 BaseAdapter를 사용하여 목록이 마지막 항목으로 스크롤된 시점 또는 마지막 항목에서 스크롤된 시점을 검출합니다.

이 문서에는 샘플 프로젝트(활동 코드 약 100줄)가 포함되어 있으며, 이 프로젝트에서는 작업 방식을 빠르게 이해할 수 있습니다.

간단한 사용법:

class Boy{

private String name;
private double height;
private int age;
//Other code

}

Boy 객체를 저장하는 어댑터는 다음과 같습니다.


public class BoysAdapter extends EndlessAdapter<Boy>{




        ViewHolder holder = null;


        if (convertView == null) {
            LayoutInflater inflater = LayoutInflater.from(parent
                    .getContext());

            holder = new ViewHolder();

            convertView = inflater.inflate(
                    R.layout.list_cell, parent, false);


            holder.nameView = convertView.findViewById(R.id.cell);

            // minimize the default image.
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        Boy boy = getItem(position);

        try {
            holder.nameView.setText(boy.getName());

            ///Other data rendering codes.

        } catch (Exception e) {
            e.printStackTrace();
        }

        return super.getView(position,convertView,parent);

}

BoysAdapter의 getView에 .getView%100%

어댑터를 작성하려면 , 다음의 순서에 따릅니다.

   adapter = new ModelAdapter() {
            @Override
            public void onScrollToBottom(int bottomIndex, boolean moreItemsCouldBeAvailable) {

                if (moreItemsCouldBeAvailable) { 
                    makeYourServerCallForMoreItems();
                } else {
                    if (loadMore.getVisibility() != View.VISIBLE) {
                        loadMore.setVisibility(View.VISIBLE);
                    }
                }
            }

            @Override
            public void onScrollAwayFromBottom(int currentIndex) { 
                loadMore.setVisibility(View.GONE);
            }

            @Override
            public void onFinishedLoading(boolean moreItemsReceived) { 
                if (!moreItemsReceived) {
                    loadMore.setVisibility(View.VISIBLE);
                }
            }
        };

loadMore 기타 를 클릭하여 item , URL에서 더 수.코드에 기재되어 있는 대로 배치하면, 어댑터는 그 버튼을 표시하는 타이밍과 디세블로 하는 타이밍을 정확하게 인식하고 있습니다. 배치합니다.xml은 이 버튼을 합니다.

즐거운 시간 되세요.

언급URL : https://stackoverflow.com/questions/1080811/android-endless-list

반응형