Android 의 RecyclerView 는 드 롭 다운 리 셋 과 더 많은 예제 불 러 오기 를 쉽게 실현 합 니 다.
11886 단어 recyclerviewandroid
1.사용자 정의 RecyclerView 는 드 롭 다운 리 셋 과 더 많은 로드 를 실현 합 니 다.
1.RecyclerView 가 위 에서 미 끄 러 지 는 지 내 려 가 는 지 어떻게 판단 합 니까?
RecyclerView 의 OnScroll Listener 미끄럼 사건 감청 에서 좋 은 방법 은 바로 onScrolled(RecyclerView recyclerView,int dx,int dy)이다.그 중에서 dx 의 값 의 양음 에 따라 왼쪽 에서 미 끄 러 지 는 지 오른쪽 에서 미 끄 러 지 는 지 판단 할 수 있 고 dy 의 값 에 따라 위 에서 미 끄 러 지 는 지 내 려 가 는 지 판단 할 수 있다.
//
if(dy>0){
//
}
//
else if(dy<0){
//
}
2.꼭대기 나 바닥 까지 미 끄 러 졌 는 지 판단 하 는 방법마찬가지 로 RecyclerView 의 OnScroll Listener 미끄럼 사건 감청 에서 onScrolled(RecyclerView recyclerView,int dx,int dy)방법 에서 처리 하고 canScroll Vertically(int direction)에 따라 판단 합 니 다.
//
if(!recyclerView.canScrollVertically(1)){
//
}
//
if(!recyclerView.canScrollVertically(-1)){
//
}
3.사용자 정의 RecyclerView미끄럼 사건 의 판단 과 처 리 를 알 게 되면 드 롭 다운 리 셋 과 로드 를 쉽게 실현 할 수 있 습 니 다.
import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.Log;
/**
* Package:com.liuting.library
* author:liuting
* Date:2017/2/14
* Desc: RecycleView,
*/
public class RefreshLoadMoreRecycleView extends RecyclerView {
private Boolean isLoadMore;//
private Boolean isLoadEnd;//
private Boolean isLoadStart;//
private Boolean isRefresh;//
private int lastVisibleItem;//
private IOnScrollListener listener;//
public RefreshLoadMoreRecycleView(Context context) {
super(context);
init(context);
}
public RefreshLoadMoreRecycleView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context);
}
public RefreshLoadMoreRecycleView(Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public void init(Context context) {
isLoadEnd=false;
isLoadStart =true;
this.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//SCROLL_STATE_DRAGGING SCROLL_STATE_IDLE
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
if (isLoadEnd) {
//
if (isLoadMore) {// , , isLoadEnd false,
if (getListener() != null) {
getListener().onLoadMore();
}
} else {//
if(getListener()!=null){
getListener().onLoaded();
}
}
isLoadEnd = false;
} else if (isLoadStart) {
if(isRefresh){
if (getListener() != null) {
getListener().onRefresh();
}
isLoadStart=false;
}
}
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
//
if(dy>0){
//
if(!recyclerView.canScrollVertically(1)){
isLoadEnd = true;
}else{
isLoadEnd = false;
}
}
//
else if(dy<0){
//
if(!recyclerView.canScrollVertically(-1)){
isLoadStart=true;
}else{
isLoadStart=false;
}
}
}
});
}
//
public interface IOnScrollListener {
void onRefresh();
void onLoadMore();
void onLoaded();
}
public IOnScrollListener getListener() {
return listener;
}
public void setListener(IOnScrollListener listener) {
this.listener = listener;
}
public Boolean getLoadMore() {
return isLoadMore;
}
//
public void setLoadMoreEnable(Boolean loadMore) {
isLoadMore = loadMore;
}
public Boolean getRefresh() {
return isRefresh;
}
//
public void setRefreshEnable(Boolean refresh) {
isRefresh = refresh;
}
}
2.실제 사례RecyclerView 가 정의 되 었 습 니 다.다음은 Demo 에서 실제 사용 하고 처리 합 니 다.
1.레이아웃 정의
레이아웃 파일 은 매우 간단 합 니 다.바로 RecyclerView 입 니 다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.liuting.refreshloadmorelistview.MainActivity">
<com.liuting.library.RefreshLoadMoreRecycleView
android:id="@+id/main_recycle_view_data"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none"
/>
</LinearLayout>
2.RecyclerView 를 정의 합 니 다.어댑터RecyclerView.Adapter 는 여기 서 간단하게 처리 합 니 다.목록 레이아웃 은 Android 자체 가 져 온 것 을 직접 사용 합 니 다.
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
/**
* Package:com.liuting.refreshloadmorelistview.adapter
* author:liuting
* Date:2017/2/16
* Desc: Adapter
*/
public class RefreshLoadMoreRecycleAdapter extends RecyclerView.Adapter<RefreshLoadMoreRecycleAdapter.ViewHolder> {
private List<String> list;
private Context context;
public RefreshLoadMoreRecycleAdapter(Context context,List<String> list) {
this.context =context;
this.list = list;
}
@Override
public RefreshLoadMoreRecycleAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_expandable_list_item_1, parent, false);
RefreshLoadMoreRecycleAdapter.ViewHolder viewHolder = new RefreshLoadMoreRecycleAdapter.ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.text.setText(list.get(position));
holder.itemView.setTag(position);
}
@Override
public int getItemCount() {
return list.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
private TextView text;
public ViewHolder(View itemView) {
super(itemView);
text=(TextView)itemView.findViewById(android.R.id.text1);
}
}
}
3.Activity 에서 컨트롤 과 데이터 로드 작업 을 정의 합 니 다.사용자 정의 RecyclerView 의 데이터 로 딩 이벤트 감청,새로 고침,로 딩,로 딩 이 완료 되 었 습 니 다.
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.widget.Toast;
import com.liuting.library.RefreshLoadMoreRecycleView;
import com.liuting.refreshloadmorelistview.adapter.RefreshLoadMoreRecycleAdapter;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements RefreshLoadMoreRecycleView.IOnScrollListener{
private RefreshLoadMoreRecycleView recycleView;// RecycleView
private List<String> list;//
private RefreshLoadMoreRecycleAdapter adapter;//Adapter
private ProgressDialog dialog;//
private static final int REFRESH_Load=0;//
private static final int MORE_Load=1;//
private Handler handler =new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case REFRESH_Load:
recycleView.setLoadMoreEnable(true);
dismissDialog();
if(list!=null){
list.clear();
}
loadData();
adapter.notifyDataSetChanged();
break;
case MORE_Load:
recycleView.setLoadMoreEnable(false);
dismissDialog();
loadData();
adapter.notifyDataSetChanged();
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
public void initView(){
dialog = new ProgressDialog(MainActivity.this);
list=new ArrayList<>();
loadData();
recycleView = (RefreshLoadMoreRecycleView)findViewById(R.id.main_recycle_view_data);
final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(MainActivity.this);
recycleView.setLayoutManager(linearLayoutManager);
adapter = new RefreshLoadMoreRecycleAdapter(MainActivity.this,list);
recycleView.setAdapter(adapter);
recycleView.setListener(this);
recycleView.setRefreshEnable(true);
recycleView.setLoadMoreEnable(true);
}
/**
*
*/
public void loadData(){
for(int i=0;i<10;i++ ){
list.add("It is "+i);
}
}
@Override
public void onRefresh() {
showDialog();
new Thread(){
@Override
public void run() {
super.run();
try {
sleep(5000);
handler.sendEmptyMessage(REFRESH_Load);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
@Override
public void onLoadMore() {
showDialog();
new Thread(){
@Override
public void run() {
super.run();
try {
sleep(5000);
handler.sendEmptyMessage(MORE_Load);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
@Override
public void onLoaded() {
Toast.makeText(MainActivity.this,"Loaded all",Toast.LENGTH_SHORT).show();
}
/**
* dismiss dialog
*/
private void dismissDialog(){
if (dialog!=null&&dialog.isShowing()){
dialog.dismiss();
}
}
/**
* show dialog
*/
private void showDialog(){
if (dialog!=null&&!dialog.isShowing()){
dialog.show();
}
}
}
3.최종 효과 도여기까지 RecyclerView 의 드 롭 다운 리 셋 과 로 딩 을 쉽게 실현 할 수 있 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Android 에서 recyclerView 아래쪽 에 투명 그 라 데 이 션 효과 추가상단 그림자 가 존재 하고 디 버 깅 시스템 에 상하 그림자 장면 을 만 들 었 는데 setSize 를 호출 하지 않 고 그림 자 를 그 렸 습 니 다.그 러 다 한참 을 뒤 척 였 지만 이 그림자 가 리 콜 러 뷰...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.