Fragment中的SwipeRefreshLayout,RecyclerView运用

因项目需要,在Fragment展示未知列的控件。
这里写图片描述

上面是我的效果图,用SwipeRefreshLayout来实现类似ListView。
首先定义MyFragment,继承Fragment,实现SwipeRefreshLayout.OnRefreshListener。具体代码如下:

public class MyFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener{
    private View view;
    private SwipeRefreshLayout refreshLayout;
    private RecyclerView recycler;
    private ImageView askQuestionIv;
    public AppApplication application;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_my_question,container,false);
//        application = view.getContext().getApplicationContext();
        application = (AppApplication) getActivity().getApplication();

        refreshLayout = (SwipeRefreshLayout)view.findViewById(R.id.my_question_swipe);
        recycler = (RecyclerView) view.findViewById(R.id.my_question_recycler);
        askQuestionIv = (ImageView) view.findViewById(R.id.ask_question_iv);
        askQuestionIv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(view.getContext(), QuestionActivity.class);
                startActivity(intent);
            }
        });

        initData();

        return view;
    }

    private void initData() {
//        System.out.println("-----refresh----");
        // 下拉刷新
        refreshLayout.setOnRefreshListener(this); // 设置刷新监听
        refreshLayout.setColorSchemeResources(R.color.orange, R.color.green, R.color.purple,R.color.swipefefresh_bg); // 进度动画颜色
//        refreshLayout.setProgressBackgroundColorSchemeResource(R.color.swipefefresh_bg); // 进度背景颜色
 // 设置布局方式,单列显示,所以 后面设置为1
        GridLayoutManager layoutManager = new GridLayoutManager(view.getContext(), 1);
        layoutManager.setOrientation(RecyclerView.VERTICAL);

        recycler.setLayoutManager(layoutManager);
        recycler.setAdapter(new ListQuestionAdapter(view.getContext(),application.lists));
//        recycler.setAdapter(new GridPicAdapter(this,lists, StrUtil.PIC));
    }
    @Override
    public void onRefresh() {
        refreshLayout.postDelayed(new Runnable() { // 发送延迟消息到消息队列
            @Override
            public void run() {
                refreshLayout.setRefreshing(false); // 是否显示刷新进度;false:不显示
            }
        },3000);
    }

}

这里讲下RecycleView和SwipeRefreshLayout的主要用法。
首先是,给SwipeRefreshLayout设置下拉刷新监听

 // 下拉刷新
        refreshLayout.setOnRefreshListener(this); // 设置刷新监听
        refreshLayout.setColorSchemeResources(R.color.orange, R.color.green, R.color.purple,R.color.swipefefresh_bg); // 进度动画颜色

刷新的实现方法如下:

@Override
    public void onRefresh() {
        refreshLayout.postDelayed(new Runnable() { // 发送延迟消息到消息队列
            @Override
            public void run() {
                refreshLayout.setRefreshing(false); // 是否显示刷新进度;false:不显示
            }
        },3000);
    }

然后再设置RecyclerView的布局方式

// 设置布局方式,单列显示,所以 后面设置为1
        GridLayoutManager layoutManager = new GridLayoutManager(view.getContext(), 1);
        layoutManager.setOrientation(RecyclerView.VERTICAL);
        recycler.setLayoutManager(layoutManager);

RecycleView提供了三种布局

1、LinearLayoutManager:线性布局管理器,支持水平和垂直效果。
  2、GridLayoutManager:网格布局管理器,支持水平和垂直效果。
  3、StaggeredGridLayoutManager:分布型管理器,瀑布流效果

布局设置完之后,设置适配器。

recycler.setAdapter(new ListQuestionAdapter(view.getContext(),application.lists));

这里我定义了一个ListQuestionAdapter适配器,具体代码如下:

public class ListQuestionAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

    public Context context;
    public List<?> lists;

    public ListQuestionAdapter(Context context,List<?> lists) {
        this.context = context;
        this.lists = lists;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View inflater = LayoutInflater.from(context).inflate(R.layout.question_lists,parent, false);
        return new QuestionViewHolder(inflater);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        ((QuestionViewHolder) holder).setData(position);
    }

    @Override
    public int getItemCount() {
        return lists != null ? lists.size() :  0;
    }

    public class QuestionViewHolder extends RecyclerView.ViewHolder{

        public TextView questionTitleTv, questionContentTv, questionTeacherTv, questionAskTv, questionDateTv;
        public RelativeLayout questionListRl;

        public QuestionViewHolder(View itemView) {
            super(itemView);
            questionTitleTv = (TextView) itemView.findViewById(R.id.question_title_tv);
            questionContentTv = (TextView) itemView.findViewById(R.id.question_content_tv);
            questionTeacherTv = (TextView) itemView.findViewById(R.id.question_teacher_tv);
            questionAskTv = (TextView) itemView.findViewById(R.id.question_ask_tv);
            questionDateTv = (TextView) itemView.findViewById(R.id.question_date_tv);
            questionListRl = (RelativeLayout) itemView.findViewById(R.id.question_lists_lot);
        }

        public void setData(final int position) {
            questionTitleTv.setText(((QuestionDetailsBean)lists.get(position)).getTitle());
            questionContentTv.setText(((QuestionDetailsBean) lists.get(position)).getContent());
            questionTeacherTv.setText(((QuestionDetailsBean) lists.get(position)).getTeacher());
            questionAskTv.setText(((QuestionDetailsBean) lists.get(position)).getIsAsk());
            questionDateTv.setText(dateToString(((QuestionDetailsBean) lists.get(position)).getTime()));
            questionListRl.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(itemView.getContext(), AnswerActivity.class);
                    intent.putExtra("bean",(QuestionDetailsBean)lists.get(position));
                    itemView.getContext().startActivity(intent);
                }
            });
        }

        public String dateToString(Date date) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String dateStr = sdf.format(date);
            return dateStr;
        }
    }

}

对于每一列应该是怎么样的,我这里写了一个布局question_lists.xml。代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/question_lists_lot"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/white"
    android:layout_marginTop="10dp"
    android:padding="20dp">

    <TextView
        android:id="@+id/question_title_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/question_title"
        android:textSize="20dp"
        android:textStyle="bold"/>

    <TextView
        android:id="@+id/question_content_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/question_content"
        android:layout_marginTop="@dimen/text_text"
        android:layout_below="@id/question_title_tv"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/question_content_tv"
        android:layout_marginTop="@dimen/text_text"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/question_teacher_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/question_teacher"
            android:layout_weight="2"/>

        <TextView
            android:id="@+id/question_ask_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/question_or_ask"
            android:textColor="@color/theme_green"
            android:layout_weight="2"/>

        <TextView
            android:id="@+id/question_date_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="@string/question_date_time"/>

    </LinearLayout>

</RelativeLayout>

ListQuestionAdapter适配器的目的就是加载该xml,并为每个控件进行赋值就行。
代码到这里,基本上就已经结束了。最后得到上面所展示的图片。
总结:
对RecyclerView,我们需要明白的地方,第一,他是干什么的。(RecyclerView是用来动态加载ListView的,也就是说,当我们需要加载很多类似的数据,类似的排版的时候,可以考虑RecyclerView,而且,当这些数据还属于懒加载行列的时候);第二,他应该怎么来用。(注意三点,1,SwipeRefreshLayout:RecyclerView的布局控件,可以监听下来刷新;2,三种布局方式;3,自定义适配器)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值