diff --git a/app/build.gradle b/app/build.gradle index 436ee6c..4db53e9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -32,6 +32,8 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.1.0' implementation "androidx.core:core-ktx:+" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + //添加Picasso依赖 + implementation 'com.squareup.picasso:picasso:2.71828' } repositories { mavenCentral() diff --git a/app/src/main/java/com/andview/example/activity/BannerRecyclerViewActivity.java b/app/src/main/java/com/andview/example/activity/BannerRecyclerViewActivity.java new file mode 100644 index 0000000..80e77df --- /dev/null +++ b/app/src/main/java/com/andview/example/activity/BannerRecyclerViewActivity.java @@ -0,0 +1,174 @@ +package com.andview.example.activity; + +import android.app.Activity; +import android.os.Bundle; +import android.os.Handler; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.andview.example.R; +import com.andview.example.ui.BannerViewPager; +import com.andview.example.ui.CustomFooterView; +import com.andview.refreshview.XRefreshView; +import com.andview.refreshview.XRefreshView.SimpleXRefreshListener; +import com.andview.refreshview.recyclerview.BaseRecyclerAdapter; +import com.andview.refreshview.recyclerview.XSpanSizeLookup; + +import java.util.ArrayList; +import java.util.List; + +public class BannerRecyclerViewActivity extends Activity { + private XRefreshView xRefreshView; + private RecyclerView recyclerView; + private MyAdapter adapter; + private List dataList = new ArrayList<>(); + private BannerViewPager bannerViewPager; + private int[] bannerImages = new int[]{R.mipmap.test01, R.mipmap.test02, R.mipmap.test03}; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_banner_recyclerview); + + // 初始化数据 + for (int i = 0; i < 20; i++) { + dataList.add("列表项 " + (i + 1)); + } + + // 初始化视图 + xRefreshView = findViewById(R.id.xrefreshview); + recyclerView = findViewById(R.id.recyclerview); + + // 设置RecyclerView + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + adapter = new MyAdapter(dataList); + recyclerView.setAdapter(adapter); + + // 创建并设置banner header + View headerView = LayoutInflater.from(this).inflate(R.layout.header_banner, null); + bannerViewPager = headerView.findViewById(R.id.banner_viewpager); + bannerViewPager.setAdapter(new BannerAdapter(bannerImages)); + adapter.setHeaderView(headerView, recyclerView); + + // 设置XRefreshView + xRefreshView.setPullLoadEnable(true); + xRefreshView.setCustomFooterView(new CustomFooterView(this)); + xRefreshView.setXRefreshViewListener(new SimpleXRefreshListener() { + @Override + public void onRefresh(boolean isPullDown) { + // 模拟刷新数据 + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + dataList.clear(); + for (int i = 0; i < 20; i++) { + dataList.add("刷新后的列表项 " + (i + 1)); + } + adapter.notifyDataSetChanged(); + xRefreshView.stopRefresh(); + } + }, 2000); + } + + @Override + public void onLoadMore(boolean isSilence) { + // 模拟加载更多数据 + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + int start = dataList.size(); + for (int i = start; i < start + 10; i++) { + dataList.add("加载更多的列表项 " + (i + 1)); + } + adapter.notifyDataSetChanged(); + xRefreshView.stopLoadMore(); + } + }, 2000); + } + }); + } + + // 自定义适配器 + private class MyAdapter extends BaseRecyclerAdapter { + private List mData; + + public MyAdapter(List data) { + mData = data; + } + + @Override + public ViewHolder getViewHolder(View view) { + return new ViewHolder(view); + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType, boolean isItem) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recyclerview, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position, boolean isItem) { + if (isItem) { + holder.textView.setText(mData.get(position)); + } + } + + @Override + public int getAdapterItemCount() { + return mData.size(); + } + + // 自定义ViewHolder + public class ViewHolder extends RecyclerView.ViewHolder { + public TextView textView; + + public ViewHolder(View itemView) { + super(itemView); + textView = itemView.findViewById(R.id.text_view); + } + } + } + + // Banner适配器 + private class BannerAdapter extends RecyclerView.Adapter { + private int[] images; + + public BannerAdapter(int[] images) { + this.images = images; + } + + @Override + public BannerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_banner, parent, false); + return new BannerViewHolder(view); + } + + @Override + public void onBindViewHolder(BannerViewHolder holder, int position) { + holder.imageView.setImageResource(images[position % images.length]); + } + + @Override + public int getItemCount() { + // 设置为 Integer.MAX_VALUE 实现无限循环 + return Integer.MAX_VALUE; + } + + // Banner ViewHolder + public class BannerViewHolder extends RecyclerView.ViewHolder { + public ImageView imageView; + + public BannerViewHolder(View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.banner_image); + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/andview/example/activity/MainActivity.java b/app/src/main/java/com/andview/example/activity/MainActivity.java index 3b28807..5abc1c4 100644 --- a/app/src/main/java/com/andview/example/activity/MainActivity.java +++ b/app/src/main/java/com/andview/example/activity/MainActivity.java @@ -71,6 +71,9 @@ public void onClick(View v) { case R.id.bt_pluse: intent = new Intent(this, PluseActivity.class); break; + case R.id.bt_banner_recyclerview: + intent = new Intent(this, BannerRecyclerViewActivity.class); + break; default: break; } diff --git a/app/src/main/java/com/andview/example/activity/recyclerview/CustomBannerRecyclerViewActivity.java b/app/src/main/java/com/andview/example/activity/recyclerview/CustomBannerRecyclerViewActivity.java new file mode 100644 index 0000000..5d1e3a2 --- /dev/null +++ b/app/src/main/java/com/andview/example/activity/recyclerview/CustomBannerRecyclerViewActivity.java @@ -0,0 +1,210 @@ +package com.andview.example.activity.recyclerview; + +import android.app.Activity; +import android.os.Bundle; +import android.os.Handler; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import com.andview.example.R; +import com.andview.example.recylerview.Person; +import com.andview.example.recylerview.SimpleAdapter; +import com.andview.example.ui.BannerViewPager; +import com.andview.example.ui.CustomGifHeader; +import com.andview.refreshview.XRefreshView; +import com.andview.refreshview.XRefreshView.SimpleXRefreshListener; +import com.andview.refreshview.XRefreshViewFooter; +import com.squareup.picasso.Picasso; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class CustomBannerRecyclerViewActivity extends Activity { + RecyclerView recyclerView; + SimpleAdapter adapter; + List personList = new ArrayList(); + XRefreshView xRefreshView; + int lastVisibleItem = 0; + LinearLayoutManager layoutManager; + private boolean isBottom = false; + private int mLoadCount = 0; + private View headerView; + private BannerViewPager mBannerViewPager; + private List bannerImageUrls = new ArrayList(); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_recylerview); + xRefreshView = (XRefreshView) findViewById(R.id.xrefreshview); + xRefreshView.setPullLoadEnable(true); + recyclerView = (RecyclerView) findViewById(R.id.recycler_view_test_rv); + recyclerView.setHasFixedSize(true); + + initData(); + initBannerData(); + + adapter = new SimpleAdapter(personList, this); + layoutManager = new LinearLayoutManager(this); + recyclerView.setLayoutManager(layoutManager); + + // 添加header banner + headerView = LayoutInflater.from(this).inflate(R.layout.custom_bannerview, null); + mBannerViewPager = (BannerViewPager) headerView.findViewById(R.id.banner_viewpager); + initBannerViewPager(); + adapter.setHeaderView(headerView, recyclerView); + + // 设置刷新头 + CustomGifHeader header = new CustomGifHeader(this); + xRefreshView.setCustomHeaderView(header); + + // 设置加载更多脚 + adapter.setCustomLoadMoreView(new XRefreshViewFooter(this)); + + recyclerView.setAdapter(adapter); + + // 设置刷新和加载更多监听 + xRefreshView.setXRefreshViewListener(new SimpleXRefreshListener() { + @Override + public void onRefresh(boolean isPullDown) { + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + // 模拟数据刷新 + refreshData(); + xRefreshView.stopRefresh(); + } + }, 2000); + } + + @Override + public void onLoadMore(boolean isSilence) { + new Handler().postDelayed(new Runnable() { + public void run() { + // 模拟加载更多数据 + loadMoreData(); + + mLoadCount++; + if (mLoadCount >= 3) { + xRefreshView.setLoadComplete(true); + } else { + xRefreshView.stopLoadMore(false); + } + } + }, 1000); + } + }); + } + + private void initData() { + for (int i = 0; i < 10; i++) { + Person person = new Person("name" + i, "" + i); + personList.add(person); + } + } + + private void initBannerData() { + // 添加一些示例图片URL + bannerImageUrls.add("https://via.placeholder.com/600x200?text=Banner+1"); + bannerImageUrls.add("https://via.placeholder.com/600x200?text=Banner+2"); + bannerImageUrls.add("https://via.placeholder.com/600x200?text=Banner+3"); + bannerImageUrls.add("https://via.placeholder.com/600x200?text=Banner+4"); + } + + private void initBannerViewPager() { + mBannerViewPager.setAdapter(new BannerAdapter()); + mBannerViewPager.setParent(recyclerView); + } + + private void refreshData() { + // 清空现有数据 + personList.clear(); + + // 添加新数据 + for (int i = 0; i < 10; i++) { + Person person = new Person("Refresh name" + i, "" + i); + personList.add(person); + } + + // 通知适配器数据变化 + adapter.notifyDataSetChanged(); + + // 重置加载更多状态 + mLoadCount = 0; + xRefreshView.setLoadComplete(false); + } + + private void loadMoreData() { + // 添加更多数据 + int start = personList.size(); + for (int i = start; i < start + 6; i++) { + Person person = new Person("Load More name" + i, "" + i); + personList.add(person); + } + + // 通知适配器数据变化 + adapter.notifyDataSetChanged(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.main, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + int menuId = item.getItemId(); + switch (menuId) { + case R.id.menu_clear: + mLoadCount = 0; + xRefreshView.setLoadComplete(false); + break; + case R.id.menu_refresh: + xRefreshView.startRefresh(); + break; + } + return super.onOptionsItemSelected(item); + } + + // 自定义Banner适配器 + private class BannerAdapter extends RecyclerView.Adapter { + + @Override + public BannerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_banner, parent, false); + return new BannerViewHolder(view); + } + + @Override + public void onBindViewHolder(BannerViewHolder holder, int position) { + String imageUrl = bannerImageUrls.get(position % bannerImageUrls.size()); + Picasso.get().load(imageUrl).into(holder.bannerImageView); + holder.bannerTextView.setText("Banner " + (position % bannerImageUrls.size() + 1)); + } + + @Override + public int getItemCount() { + // 返回较大的数,实现无限循环 + return Integer.MAX_VALUE; + } + + class BannerViewHolder extends RecyclerView.ViewHolder { + ImageView bannerImageView; + TextView bannerTextView; + + public BannerViewHolder(View itemView) { + super(itemView); + bannerImageView = (ImageView) itemView.findViewById(R.id.banner_image); + bannerTextView = (TextView) itemView.findViewById(R.id.banner_text); + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_banner_recyclerview.xml b/app/src/main/res/layout/activity_banner_recyclerview.xml new file mode 100644 index 0000000..cac0fbd --- /dev/null +++ b/app/src/main/res/layout/activity_banner_recyclerview.xml @@ -0,0 +1,20 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 08f278a..d9407f3 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -130,6 +130,14 @@ android:onClick="onClick" android:text="办单超人刷新" /> +