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

来源:互联网 发布:电脑桌面滚动字幕软件 编辑:程序博客网 时间:2024/06/17 10:09

一.项目简介和思路

 上次我们已经实现了上拉刷新和下拉加载,今天接着来。之前的点击的不同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