一.项目简介和思路
上次我们已经实现了上拉刷新和下拉加载,今天接着来。之前的点击的不同tab的内容都是一样的,现在来实现点击不同的tab显示不用内容的数据。还有一个功能是给recycle写点击监听事件。
二.项目流程
1.tablayout的点击事件
public class MainActivity extends AppCompatActivity {
private TabLayout mTablayout; //顶部标题选项布局
private ViewPager mViewpager;
private FirstpageFragment mFragment;
private List<FirstpageFragment> mFirstFragments;//存放fragment集合
private String[] mList_title; //存放标题
private MainTabAdapter mAdapter_title;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Fresco.initialize(this);
initData();
initView();
initListener();
}
private void initListener() {
mTablayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
// Log.i("777","ontabselected----------->"+tab.getPosition());
int position=tab.getPosition();
for(int i=0;i<mFirstFragments.size();i++){
mFirstFragments.get(position).setposition(position);
}
mViewpager.setCurrentItem(position);
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
public void setposition(int position) {
mPosition=position;
initData();
}
因为tablayout是在main.activity里写的,所以得在这里写tab的单击事件。这里通过对mtablayout通过内部类方式写监听事件。然后重写三个方法,这里主要用到的是ontabselected(),就是当点击了顶部标题tab就触发事件,然后执行后面的程序,getposition就是获取当前点击位置position,然后通过setposition()根据不同的位置给相应的fragment填充数据。 这里有个地方要注意的就是 mviewpager.setcurrentitem(),它是设置滑动页面时,顶部标题与viewpager对应,这句一定得加上,不加有可能会导致点击顶部标题后viewpager没变化。
注意1:这里可能会到到一个问题,就是滑动页面的时候可能出现底部上拉刷新图标,这是因为设置该控件时应该让它有数据的时候才出现,否则它会在数据还没加载的时候就出现。这里我们只需要在代码中简单改下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/progress_lin"
android:orientation="horizontal"
android:gravity="center"
android:visibility="gone"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="loading....."/>
</LinearLayout>
在itemfoot.xml中把顶部刷新控件可见属性visibility设置为“gone”隐藏,然后在主程序firstpageadapter文件中,设置其在有数据的时候才开始显示:
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
//判断holder是不是BannerViewHolder
if (holder instanceof BannerViewHolder) {
BannerViewHolder bannerViewHolder = (BannerViewHolder) holder; // 把指向子类对象的父类引用holder赋给子类的引用 bannerViewHolder,
//属于向下转换,需要强制转换类型
bannerViewHolder.banner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR_TITLE);
bannerViewHolder.banner.setBannerTitle(bean.getTitle());
bannerViewHolder.banner.setImages( bean.getImg_url());
// Log.i("tag","--------------------------onbindview");
} else if (holder instanceof ItemViewHolder) {
ItemViewHolder itemViewHolder = (ItemViewHolder) holder;
itemViewHolder.simpleView.setImageURI(item_data.get(position - 1).getThumbnail());
itemViewHolder.textView.setText(item_data.get(position - 1).getTitle());
}
else if(holder instanceof FootViewHolder){
if(item_data.size()>0){
((FootViewHolder)holder).progress_lin.setVisibility(View.VISIBLE);//当有数据的时候开始显示上拉刷新
}
}
最后看看运行效果:
可以看出来,点击不同的顶部栏可以切换不用的页面了,这部分就算完成了。
2.recycleview点击事件
//recyview单击事件回调接口
public interface MyItemClickListenter{
void onclick (View itemView,int position);
}
//本来中保存一个接口的引用
private MyItemClickListenter listenter;
//接口类型初始化,监听类注册
public void setMyItemClickListener(MyItemClickListenter listenter){
this.listenter=listenter;
}
此部分代码在firstpageradapter.java里,这里又用到了接口回调,不过和之前不同的是,这里用的是监听事件来实现。不过大体的思路是一样的。首先也的先定义一个接口,里面写用来实现什么功能的方法,我们这里是要实现监听点击不同位置的item后触发事件。然后还是和之前一样,声明一个接口对象和初始化接口类型,把要监听的类注册进来,要不然点击触发后怎么通知你(这里就像之前说的数据加载完后通知你,所以你得要告诉它)-----------------------
//把数据绑定到viewholder
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
//判断holder是不是BannerViewHolder
if (holder instanceof BannerViewHolder) {
BannerViewHolder bannerViewHolder = (BannerViewHolder) holder; // 把指向子类对象的父类引用holder赋给子类的引用 bannerViewHolder,
//属于向下转换,需要强制转换类型
bannerViewHolder.banner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR_TITLE);
bannerViewHolder.banner.setBannerTitle(bean.getTitle());
bannerViewHolder.banner.setImages( bean.getImg_url());
// Log.i("tag","--------------------------onbindview");
} else if (holder instanceof ItemViewHolder) {
ItemViewHolder itemViewHolder = (ItemViewHolder) holder;
itemViewHolder.simpleView.setImageURI(item_data.get(position - 1).getThumbnail());
itemViewHolder.textView.setText(item_data.get(position - 1).getTitle());
if(listenter!=null){
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listenter.onclick(v,position); //给接口赋值(通过接口实现方法来赋值)
}
});
}
else if(holder instanceof FootViewHolder){
if(item_data.size()>0){
((FootViewHolder)holder).progress_lin.setVisibility(View.VISIBLE);//当有数据的时候开始显示上拉刷新
}
}
}
}
同样在firstpageradapter.java里,在此函数里加上当点击事件触发后的回调,也就是if(listen!==null)()部分的代码,通过listener.onclick()去通知监听类来进行回调。(这里就好比之前的数据加载完成后通知监听类)。------------
private void initListener() {
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener(){
@Override
//状态发生变化是触发
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if(newState==RecyclerView.SCROLL_STATE_IDLE&&lastVisibleItem+1==adapter.getItemCount()){
mhandler.postDelayed(new Runnable() {
@Override
public void run() {
now_num+=LOADNUM;
initData();
}
},1500);
}
}
@Override//滚动时监听
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
LinearLayoutManager Lm= (LinearLayoutManager) recyclerView.getLayoutManager();
lastVisibleItem=Lm.findLastVisibleItemPosition();
}
});
adapter.setMyItemClickListener(new FirstPageAdapter.MyItemClickListenter() {
@Override
public void onclick(View v, int position) {
Log.i("888","onclick----------->position"+position);// 在这里获取数据,进行处理
}
});
}
最后,在firstpagerfragment.java的监听事件方法中,完成对onclick方法的回调(也就是数据加载完后得到通知进行数据的更新),在这里我们通过log打印,然后点击item的不同位置,会看到有打印出相应的位置值。最后由于gif太大,就上传张图片效果: