因项目需要,在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,自定义适配器)