안드로이드 엔드리스 목록
목록 끝에 도달하면 더 많은 항목을 로드할 수 있도록 알림을 받는 목록을 작성하려면 어떻게 해야 합니까?
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
단, 스크롤 조작 중에는 표시/총 카운트 계산이 전혀 실행되지 않기 때문에 로우엔드 디바이스에서 스크롤 성능이 훨씬 우수하다는 것을 알 수 있습니다.
- 의 ★★★를 빌려주세요.
ListFragment
★★★★★★★★★★★★★★★★★」ListActivity
OnScrollListener
다음 메서드를 해당 클래스에 추가합니다.
@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
예를 들어 사용자는 더 많은 항목을 로드하기 위해 목록의 맨 끝으로 스크롤해야 합니다.(옵션)보다시피 "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>
(옵션) 마지막으로 호출하여 로드 인디케이터를 삭제합니다.
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 저장소를 통해 사용할 수 있습니다.
지정된 코드는 다음을 나타냅니다.
- ListView: HTTP 페이지 지정 요구에 의해 입력됩니다.
- Network Image View 사용 현황.
- 미리 읽기 기능이 있는 "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
'programing' 카테고리의 다른 글
YAML을 사용하여 파이프라인을 트리거하는 Azure 파이프라인 (0) | 2023.04.22 |
---|---|
'for' 루프를 사용하여 디렉토리 내의 모든 파일을 반복합니다. (0) | 2023.04.22 |
Active Directory에서 사용자 목록을 가져오려면 어떻게 해야 합니까? (0) | 2023.04.22 |
Excel에서 셀 너비 조정 (0) | 2023.04.22 |
지정된 텍스트를 포함하는 파일 찾기 (0) | 2023.04.22 |