Android RecycleView的下拉刷新和上拉加载,条目的点击事件

1.布局文件部分

bottom_layout.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="30dp"
    android:gravity="center"
    >

    <ProgressBar
        android:id="@+id/progress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:progressDrawable="@drawable/anim_progress" //这个可以根据需求进行更改
        android:indeterminate="true"

        />

    <TextView
        android:id="@+id/bottom_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:text="加载中"
        />

</LinearLayout>
anim_progress.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:id="@android:id/background">

        <shape>

            <corners android:radius="5dip" />

            <gradient
                android:angle="0"
                android:centerColor="#ff5a5d5a"
                android:centerY="0.75"
                android:endColor="#ff747674"
                android:startColor="#ff9d9e9d" />
        </shape>
    </item>

    <item android:id="@android:id/secondaryProgress">

        <clip>

            <shape>

                <corners android:radius="5dip" />

                <gradient
                    android:angle="0"
                    android:centerColor="#80ffb600"
                    android:centerY="0.75"
                    android:endColor="#a0ffcb00"
                    android:startColor="#80ffd300" />
            </shape>
        </clip>
    </item>

    <item android:id="@android:id/progress">

        <clip>

            <shape>

                <corners android:radius="5dip" />

                <gradient
                    android:angle="0"
                    android:endColor="#8000ff00"
                    android:startColor="#80ff0000" />
            </shape>
        </clip>
    </item>

</layer-list>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.chint.vstori.customrecycleview.MainActivity">


    <android.support.v4.widget.SwipeRefreshLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/swipe">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycle_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    </android.support.v4.widget.SwipeRefreshLayout>

</LinearLayout>

2.定义的适配器部分

public abstract class BaseLoadAdapter<T> extends RecyclerView.Adapter {


    public static final int TYPE_ITEM = 1;
    public static final int TYPE_BOTTOM = 2;

    public int loadState;
    public static final int STATE_LOADING = 1;
    public static final int STATE_LASTED = 2;
    public static final int STATE_ERROR = 3;

    boolean hasMore = true;
    boolean isLoading = false;

    private int pageCount = 10;
    public List<T> list;


    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_BOTTOM) {//上拉加载部分
            return new BottomViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.bottom_layout, parent, false));
        } else {
            return setItemViewHolder(parent, viewType);//正常数据加载
        }
    }

    protected abstract RecyclerView.ViewHolder setItemViewHolder(ViewGroup parent, int viewType);

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
        if (TYPE_BOTTOM == getItemViewType(position)) {

            final ProgressBar progressBar = ((BottomViewHolder) holder).progressBar;
            final TextView bottomTextView = ((BottomViewHolder) holder).bottomTextView;


            switch (loadState) {
                case STATE_LOADING:
                    progressBar.setVisibility(View.VISIBLE);
                    bottomTextView.setText("加载中");
                    holder.itemView.setOnClickListener(null);
                    hasMore = true;
                    break;
                case STATE_LASTED:
                    progressBar.setVisibility(View.GONE);
                    bottomTextView.setText("没有更多了");
                    holder.itemView.setOnClickListener(null);
                    hasMore = false;
                    break;
                case STATE_ERROR:
                    progressBar.setVisibility(View.GONE);
                    bottomTextView.setText("加载失败请点击重试");
                    holder.itemView.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            progressBar.setVisibility(View.VISIBLE);
                            bottomTextView.setText("加载中");
                            LoadingMore();
                        }
                    });
                    hasMore = true;
                    break;
            }
        } else {
            onBindItemViewHolder(holder, position);
        }
    }

    protected abstract void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position);

    @Override
    public int getItemViewType(int position) {
        if (list.size() < pageCount) {
            return TYPE_ITEM;
        } else {
            if (position == list.size()) {
                return TYPE_BOTTOM;
            } else {
                return TYPE_ITEM;
            }
        }
    }

    @Override
    public int getItemCount() {
        if (list.size() < pageCount) {
            hasMore = false;
            return list.size();
        } else {
            return list.size() + 1;
        }
    }


    protected abstract void LoadingMore();

    public void setErrorStatus() {
        loadState = STATE_ERROR;
        notifyItemChanged(list.size());
        setLoading(false);
    }

    public void setLastedStatus() {
        loadState = STATE_LASTED;
        notifyItemChanged(list.size());
    }


    public void addList(List addList) {
        int count = this.list.size();
        this.list.addAll(addList);
        notifyItemRangeChanged(count, addList.size());
        setLoading(false);
    }

    public void refreshList(List newList) {
//        this.list.clear();
        this.list.addAll(newList);
        notifyDataSetChanged();
    }

    public class BottomViewHolder extends RecyclerView.ViewHolder {

        TextView bottomTextView;
        ProgressBar progressBar;

        public BottomViewHolder(View itemView) {
            super(itemView);
            bottomTextView = (TextView) itemView.findViewById(R.id.bottom_title);
            progressBar = (ProgressBar) itemView.findViewById(R.id.progress);
        }
    }

    public void setPageCount(int pageCount) {
        this.pageCount = pageCount;
    }

    public int getPageCount() {
        return pageCount;
    }

    public boolean isHasMore() {
        return hasMore;
    }

    public void setHasMore(boolean hasMore) {
        this.hasMore = hasMore;
    }

    public boolean isLoading() {
        return isLoading;
    }

    public void setLoading(boolean loading) {
        isLoading = loading;
    }
}

 3.加载更多处理

public class LoadMoreScrollListener extends RecyclerView.OnScrollListener {

    private RecyclerView recyclerView;

    public LoadMoreScrollListener(RecyclerView recyclerView) {
        this.recyclerView = recyclerView;
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
        BaseLoadAdapter adapter = (BaseLoadAdapter) recyclerView.getAdapter();

        if (null == manager) {
            throw new RuntimeException("you should call setLayoutManager() first!!");
        }

        if(manager instanceof LinearLayoutManager){
            int lastVisibleItemPosition = ((LinearLayoutManager) manager).findLastVisibleItemPosition();

            Log.v("dyp","lastVisibleItemPosition:"+lastVisibleItemPosition+",adapter.getItemCount()-1 :"+ (adapter.getItemCount()-1) +",hasMore:"+adapter.hasMore);

            if(adapter.hasMore && adapter.getItemCount() > adapter.getPageCount() && adapter.getItemCount()-1 == lastVisibleItemPosition){
                if(!adapter.isLoading()){
                    adapter.LoadingMore();
                }

            }
        }
    }
}

4.条目点击处理

public interface OnRecyclerViewClickListener {

    void onItemClickListener(View view);
    void onItemLongClickListener(View view);

}

5.定义bean

public class PersonBean {

    private String name;
    private String email;

    public PersonBean(String name, String email) {
        this.name = name;
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "PersonBean{" +
                "name='" + name + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

 

6.activity处理

public class MainActivity extends AppCompatActivity implements MainAdapter.LoadMoreListener, SwipeRefreshLayout.OnRefreshListener ,OnRecyclerViewClickListener {


    List<PersonBean> list = new ArrayList<>();
    RecyclerView recyclerView;

    MainAdapter adapter;
    SwipeRefreshLayout layout;

    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){

                case 1:
                    adapter.setErrorStatus();
                    break;
                case 2:
                    adapter.setLastedStatus();
                    break;
                case 3:
                    List<PersonBean> list = new ArrayList<>();
                    for (int i = 0; i < 10; i++) {
                        list.add(new PersonBean("mm"+i,"稳"+i));
                    }
                    adapter.addList(list);
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = (RecyclerView) findViewById(R.id.recycle_view);

        layout = (SwipeRefreshLayout) findViewById(R.id.swipe);
        layout.setOnRefreshListener(this);
        layout.setRefreshing(false);
        for (int i = 0; i < 10; i++) {
            list.add(new PersonBean("mm"+i,"稳"+i));
        }

        adapter = new MainAdapter(this,list,this);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setOnScrollListener(new LoadMoreScrollListener(recyclerView));
        recyclerView.setAdapter(adapter);
        adapter.setItemClickListener(this);



    }

    @Override
    public void loadMoreData() {
        if(adapter.isLoading()){
            return;
        }
        adapter.setLoading(true);
        Random random = new Random();
        int randomInt = random.nextInt(3)+1;
        Log.v("dyp","random:"+randomInt);
        if(randomInt == 1){
            handler.sendEmptyMessageDelayed(1,3000);
        }else if(randomInt == 2){
            handler.sendEmptyMessageDelayed(2,3000);
        }else{
            handler.sendEmptyMessageDelayed(3,3000);
        }



    }

    @Override
    public void onRefresh() {
        if(adapter!=null){
            if(null!=list){//清除预留的数据
                list.clear();
            }
            for (int i = 0; i < 10; i++) {
                list.add(new PersonBean("nn"+i,"稳"+i));
            }
            if(null != list){
                layout.setRefreshing(false);
                adapter.refreshList(list);
            }
        }
    }

    @Override
    public void onItemClickListener(View view) {
        int position = recyclerView.getChildAdapterPosition(view);
        PersonBean personBean = adapter.list.get(position);
    }

    @Override
    public void onItemLongClickListener(View view) {
    }
}

7.mainAdapter处理

public class MainAdapter extends BaseLoadAdapter<PersonBean> {

    Context context;
    LoadMoreListener listener;

    public MainAdapter(Context context, List<PersonBean> list, LoadMoreListener listener) {
        this.context = context;
        this.list = list;
        this.listener = listener;
    }

    @Override
    protected RecyclerView.ViewHolder setItemViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.main_item_layout, parent, false);
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                itemListener.onItemClickListener(v);//条目的点击事件
            }
        });
        view.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                itemListener.onItemLongClickListener(v);//条目的长按事件
                return true;
            }
        });
        return new MainViewHolder(view);
    }

    @Override
    protected void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position) {
        ((MainViewHolder) holder).nameText.setText(list.get(position).getName());
        ((MainViewHolder) holder).typeText.setText(list.get(position).getEmail());
    }

    @Override
    protected void LoadingMore() {
        if (listener == null) {
            return;
        }
        listener.loadMoreData();
    }

    static class MainViewHolder extends RecyclerView.ViewHolder {
        TextView nameText;
        TextView typeText;

        public MainViewHolder(View itemView) {
            super(itemView);

            nameText = (TextView) itemView.findViewById(R.id.name);
            typeText = (TextView) itemView.findViewById(R.id.type);
        }
    }

    public interface LoadMoreListener {
        void loadMoreData();
    }

    //recycleview条目的点击事件
    private OnRecyclerViewClickListener itemListener;

    public void setItemClickListener(OnRecyclerViewClickListener itemClickListener) {
        itemListener = itemClickListener;
    }

}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值