RecyclerView实现上拉刷新,下拉加载,item点击事件

最近发现RecyclerView这么个东西。据说是用来替代ListView和GridView的,没事研究下,虽然选的是原创,但是还是借鉴了网上的的诸多大神,感谢一下!


1、添加依赖

RecyclerView是新出的,首先要添加依赖:
 compile 'com.android.support:support-v4:21.0.2'
 compile 'com.android.support:appcompat-v7:21.0.0'
 compile 'com.android.support:recyclerview-v7:21.0.0'
compile 'com.android.support:cardview-v7:21.0.0'
 
 

2、布局文件

    <view xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/course_swipeRefreshLayout"
        class="android.support.v4.widget.SwipeRefreshLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <view xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/course_recylerView"
            class="android.support.v7.widget.RecyclerView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"></view>
    </view>

SwipeRefreshLayout用来刷新

3、刷新和自动加载


		//上拉刷新
		mLayoutManager = new LinearLayoutManager(getActivity());
		mRecyclerView.setLayoutManager(mLayoutManager);
		mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
			@Override
			public void onRefresh() {

				if (isRefreshing) {

				} else {
					onHeaderRefresh();
					isRefreshing = false;
				}
			}
		});


<span style="white-space:pre">		</span>//自动加载
		mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
			@Override
			public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
				super.onScrolled(recyclerView, dx, dy);
				int lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();
				int totalVisibleItem = mLayoutManager.getItemCount();
				//表示剩下2个item自动加载
				// dy>0 表示向下滑动
				if(lastVisibleItem >= totalVisibleItem-2 && dy>0){

					if(isLoadingMore){

					}else {
						onFooterRefresh();
						isLoadingMore = false;
					}

				}

			}
		});

如果想用GridView可以用下面的

  @Override
  public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
<span style="white-space:pre">	</span>super.onScrolled(recyclerView, dx, dy);
<span style="white-space:pre">	</span>int[] visibleItems = mLayoutManager.findLastVisibleItemPositions(null);
 <span style="white-space:pre">	</span> int lastitem = Math.max(visibleItems[0],visibleItems[1]);
<span style="white-space:pre">	</span> Log.d(TAG,"visibleItems =" + visibleItems);
 <span style="white-space:pre">	</span> Log.d(TAG,"lastitem =" + lastitem);
 <span style="white-space:pre">	</span> Log.d(TAG,"adapter.getItemCount() =" + adapter.getItemCount());
 <span style="white-space:pre">	</span> if (dy > 0 && lastitem > adapter.getItemCount() - 5 && !isLoadingMore) {
 <span style="white-space:pre">	</span> Log.d(TAG,"will loadNewFeeds");
<span style="white-space:pre">	</span>}
 }

我的Adapter

public class IndexCourseRecyleViewAdapter extends RecyclerView.Adapter<IndexCourseRecyleViewAdapter.ViewHolder> {

    private List<CourseModel> mlist;
    private Context context;

    private ImageLoader imageLoader = ImageLoader.getInstance();
    private DisplayImageOptions headOptions;

    public IndexCourseRecyleViewAdapter(List<CourseModel> mlist, Context context) {
        this.mlist = mlist;
        this.context = context;
        initOptions();
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.course_hot_list_item,parent,false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        try {
            imageLoader.displayImage(mlist.get(position).getPath(),
                    holder.courseImage, headOptions);
        }catch (Exception e){
            e.printStackTrace();
        }
        holder.courseName.setText("《" + mlist.get(position).getName() + "》");
        holder.courseCount.setText(mlist.get(position).getCoursePeriod() + context.getResources().getString(R.string.course_item1));
        holder.courseStart.setText(mlist.get(position).getCourseStart().replace('-','.'));
        holder.courseEnd.setText(mlist.get(position).getCourseEnd().replace('-', '.'));


    }


    @Override
    public int getItemCount() {
        return mlist.size();
    }

    public  class ViewHolder extends RecyclerView.ViewHolder{

        public ImageView courseImage;
        public TextView courseName;
        public TextView courseCount;
        public TextView courseStart;
        public TextView courseEnd;

        public ViewHolder(View itemView) {
            super(itemView);
            courseImage = (ImageView) itemView.findViewById(R.id.course_hot_class_image);
            courseName = (TextView) itemView.findViewById(R.id.course_hot_course_name);
            courseCount = (TextView) itemView.findViewById(R.id.course_hot_course_count);
            courseStart = (TextView) itemView.findViewById(R.id.course_hot_course_start);
            courseEnd = (TextView) itemView.findViewById(R.id.course_hot_course_end);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    doOnItemClickListener(getPosition());
                }
            });

        }
    }
    private void initOptions() {
        headOptions = OptionTools.getHeadOptions(context);

    }

    private OnItemClickListener onItemClickListener;

    public interface OnItemClickListener {
        public void onClick(int position);
    }

    public void setOnItemClickListener(
            OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

    public void doOnItemClickListener(int position) {
        if (onItemClickListener != null) {
            this.onItemClickListener.onClick(position);
        }
    }

}
注意:adapter不要忘了加泛型哦

4、item的点击事件

这个adapter里已经声明了接口,用adapte实现一下就ok

		adapter.setOnItemClickListener(new IndexCourseRecyleViewAdapter.OnItemClickListener() {
			@Override
			public void onClick(int position) {
				Intent intent = new Intent(getActivity(), CourseDetailActivity.class);
				intent.putExtra("courseID",courseModelList.get(position).getCourseId());
				startActivity(intent);
			}
		});

本人刚毕业菜鸟一枚,第一篇博客,希望诸位大神多多指教!代码有点乱希望海涵







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下拉刷新上拉加载更多是Android开发中比较常见的功能,而渐变动画效果可以增强用户体验。下面是一个简单的示例代码,演示如何在Android Studio上实现下拉刷新上拉加载更多功能,并添加渐变动画效果。 首先,在项目的build.gradle文件中添加依赖项: ``` dependencies { implementation 'com.android.support:recyclerview-v7:28.0.0' implementation 'com.android.support:swiperefreshlayout:28.0.0' } ``` 然后在布局文件中添加RecyclerViewSwipeRefreshLayout: ```xml <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipeRefreshLayout" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="vertical" /> </android.support.v4.widget.SwipeRefreshLayout> ``` 接下来,在Activity或Fragment中,初始化RecyclerViewSwipeRefreshLayout,并添加下拉刷新上拉加载更多的监听器: ```java private SwipeRefreshLayout swipeRefreshLayout; private RecyclerView recyclerView; private LinearLayoutManager layoutManager; private MyAdapter adapter; private List<String> dataList = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); swipeRefreshLayout = findViewById(R.id.swipeRefreshLayout); recyclerView = findViewById(R.id.recyclerView); layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); adapter = new MyAdapter(dataList); recyclerView.setAdapter(adapter); // 下拉刷新监听器 swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { // 执行刷新操作 refreshData(); } }); // 上拉加载更多监听器 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if (dy > 0 && !isLoading && !isLastPage) { int visibleItemCount = layoutManager.getChildCount(); int totalItemCount = layoutManager.getItemCount(); int pastVisibleItems = layoutManager.findFirstVisibleItemPosition(); if ((visibleItemCount + pastVisibleItems) >= totalItemCount) { loadMoreData(); } } } }); // 模拟初始化数据 for (int i = 0; i < 20; i++) { dataList.add("Item " + (i + 1)); } adapter.notifyDataSetChanged(); } // 模拟下拉刷新操作 private void refreshData() { new Handler().postDelayed(new Runnable() { @Override public void run() { dataList.clear(); for (int i = 0; i < 20; i++) { dataList.add("Item " + (i + 1)); } adapter.notifyDataSetChanged(); swipeRefreshLayout.setRefreshing(false); } }, 2000); } // 模拟上拉加载更多操作 private void loadMoreData() { isLoading = true; new Handler().postDelayed(new Runnable() { @Override public void run() { if (dataList.size() >= 60) { isLastPage = true; isLoading = false; return; } int startPosition = dataList.size(); for (int i = startPosition; i < startPosition + 20; i++) { dataList.add("Item " + (i + 1)); } adapter.notifyItemRangeInserted(startPosition, 20); isLoading = false; } }, 2000); } ``` 最后,为了增加渐变动画效果,我们可以在drawable文件夹下创建一个shape.xml文件,定义渐变效果: ```xml <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:startColor="#ffffff" android:endColor="#f5f5f5" android:type="linear" android:angle="0" /> </shape> ``` 然后将这个渐变效果应用到SwipeRefreshLayout的背景上: ```xml <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipeRefreshLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/shape"> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:scrollbars="vertical" /> </android.support.v4.widget.SwipeRefreshLayout> ``` 这样,就可以在Android Studio上实现下拉刷新上拉加载更多功能,并添加渐变动画效果了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值