在前面的博客中有讲到过点击一个图片按钮控制RecyclerView的滚动到顶部位置的效果,但是那个图片按钮一直处在一个显示的状态,今天我们来改造一下那个地方,我们要实现的效果是:一开始打开的时候看不到这个图片按钮,当去滑动界面的时候才能去显示这个图片按钮。
要实现这个效果也很简单,我们监听RecyclerView的LayoutManager的SpanSizeLookup事件即可,在HomeFragment类中的processData方法去完善,如下图:
只需要在这一块去添加这样的逻辑就可以了,整体的代码如下所示:
package com.nyl.shoppingmall.home.fragment; import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast; import com.alibaba.fastjson.JSON;
import com.nyl.shoppingmall.R;
import com.nyl.shoppingmall.base.BaseFragment;
import com.nyl.shoppingmall.home.adapter.HomeFragmentAdapter;
import com.nyl.shoppingmall.home.bean.ResultBeanData;
import com.nyl.shoppingmall.utils.Constants;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.StringCallback; import okhttp3.Call; /**
* 首页Fragment
*/
public class HomeFragment extends BaseFragment implements View.OnClickListener { private final static String TAG = HomeFragment.class.getSimpleName(); private TextView tv_search_home;
private TextView tv_message_home;
private RecyclerView rv_home;
private ImageView ib_top;
private HomeFragmentAdapter adapter;
//返回的数据
private ResultBeanData.ResultBean resultBean; @Override
public View initView() {
Log.e(TAG,"主页面的Fragment的UI被初始化了");
View view = View.inflate(mContext,R.layout.fragment_home,null);
//初始化布局控件
tv_search_home = (TextView) view.findViewById(R.id.tv_search_home);
tv_message_home = (TextView) view.findViewById(R.id.tv_message_home);
rv_home = (RecyclerView) view.findViewById(R.id.rv_home);
ib_top = (ImageView) view.findViewById(R.id.ib_top); //设置点击事件
ib_top.setOnClickListener(this);
tv_search_home.setOnClickListener(this);
tv_message_home.setOnClickListener(this);
return view;
} @Override
public void initData() {
super.initData();
Log.e(TAG,"主页面的Fragment的数据被初始化了"); //联网请求首页数据
getDataFromNet();
} private void getDataFromNet() {
// String url = Constants.HOME_URL;
OkHttpUtils
.get()
.url(Constants.HOME_URL)
.build()
.execute(new StringCallback()
{ /**
* 请求失败的时候回调
* @param call
* @param e
* @param id
*/
@Override
public void onError(Call call, Exception e, int id) { Log.e(TAG,"首页请求失败=="+e.getMessage());
} /**
* 当联网成功的时候回调
* @param response 请求成功数据
* @param id
*/
@Override
public void onResponse(String response, int id) { Log.e(TAG,"首页请求成功=="+response);
//解析数据
processData(response);
}
});
} /**
* 解析数据
* @param json
*/
private void processData(String json) {
//使用FastJson去解析数据,将Json字符串转换成一个ResultBeanData对象
ResultBeanData resultBeanData = JSON.parseObject(json,ResultBeanData.class);
resultBean = resultBeanData.getResult(); if (resultBean != null){
//有数据就设置适配器
adapter = new HomeFragmentAdapter(mContext,resultBean);
rv_home.setAdapter(adapter); GridLayoutManager manager = new GridLayoutManager(mContext,1);
//设置跨度大小监听
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (position <= 3){
//隐藏
ib_top.setVisibility(View.GONE);
}else {
//显示
ib_top.setVisibility(View.VISIBLE);
}
//只能返回1
return 1;
}
});
//设置布局管理者
rv_home.setLayoutManager(manager);
}else {
//没有数据 } Log.e(TAG,"解析成功=="+resultBean.getHot_info().get(0).getName());
} @Override
public void onClick(View view) {
switch (view.getId()){
case R.id.ib_top: //置顶的监听
rv_home.scrollToPosition(0);
break;
case R.id.tv_search_home: //搜索的监听
Toast.makeText(mContext,"搜索",Toast.LENGTH_SHORT).show();
break;
case R.id.tv_message_home: //消息监听
Toast.makeText(mContext,"进入消息中心",Toast.LENGTH_SHORT).show();
break;
}
}
}
还有最重要的一步,之前fragment_home.xml的布局中的ImageButton设置的是显示按钮图片的,如下图所示:
这个是要显示的意思,把它改成隐藏的就可以了,如下图所示:
通过这样改造之后,就可以实现:一开始打开的时候看不到这个图片按钮,当去滑动界面的时候才能去显示这个图片按钮的效果了。
好了,本篇博客的内容就这么多了。