安卓仿手机网易新闻app项目开发系列之(五)tablayout事件和recycle事件

一.项目简介和思路

 上次我们已经实现了上拉刷新和下拉加载,今天接着来。之前的点击的不同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太大,就上传张图片效果:



  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值