一、viewpager
viewpager可用来写仿微信界面滑动切换fragment,需要添加v4依赖。
首先创建两个fragment,这里继承的是v4中的frgment,xml布局文件就只有一个text。另一个fragment也一样。
public class BlankFragment extends Fragment {
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_blank, container, false);
return view;
}
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".BlankFragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="1111111111111" />
</FrameLayout>
接下来声明一个自定义Adapter继承自FragmentPagerAdapter,是用来向viewpager中添加fragments的,需要一个List,还需要overwrite 构造函数、getItem和getCount。
public class MyPagerAdapter extends FragmentPagerAdapter {
List<Fragment> fragments;//需要添加的fragments
public MyPagerAdapter(FragmentManager fm,List<Fragment> fragments) {
super(fm);
this.fragments=fragments;
}
@Override
public Fragment getItem(int i) {
return fragments.get(i);
}
@Override
public int getCount() {
return fragments.size();
}
}
接下来就是在main函数中
private ViewPager vp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//requestWindowFeature(Window.FEATURE_NO_TITLE); //声明没有title
//getSupportActionBar().hide(); //声明没有actionbar
setContentView(R.layout.activity_main);
initViewPager();
}
private void initViewPager() {
List<Fragment> fragments=new ArrayList<>();
fragments.add(new BlankFragment());
fragments.add(new BlankFragment2());
vp=(ViewPager)findViewById(R.id.mainViewPager);
FragmentManager fragmentManager=getSupportFragmentManager(); //获取FragmentManager
vp.setAdapter(new MyPagerAdapter(fragmentManager,fragments)); //绑定,需要用到一个自定义fragment的List,二是FragmentManager。
}
遇到的问题:
1.当MainActivity继承自Activity时,不能使用getSupportFragmentManager,需要修改成AppCompatActivity。
2.xml文件不显示Design界面,界面api按钮边上有个app theme,修改成其他theme即可。
3.直接新建fragment会有点问题,需要指定v4版本的fragment,可以新建类继承自android.support.v4.app.Fragment。
二、recycleview
类似于listview,需要添加v7依赖包。
首先创建recycleview中每个item类和item布局xml文件:
public class ArticleItem {
String ImageUrl;
String Title;
String Abstract;
public ArticleItem() {
ImageUrl=null;
Title=null;
Abstract=null;
}
public String getImageUrl() {
return ImageUrl;
}
public void setImageUrl(String imageUrl) {
ImageUrl = imageUrl;
}
public String getTitle() {
return Title;
}
public void setTitle(String title) {
Title = title;
}
public String getAbstract() {
return Abstract;
}
public void setAbstract(String anAbstract) {
Abstract = anAbstract;
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/item_image"
android:layout_width="135dp"
android:layout_height="136dp"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_marginStart="0dp"
android:layout_weight="1"
app:srcCompat="@mipmap/ic_launcher" />
<RelativeLayout
android:layout_width="228dp"
android:layout_height="152dp"
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:layout_weight="2"
android:orientation="vertical">
<TextView
android:id="@+id/item_header"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginTop="14dp"
android:layout_weight="1"
android:text="标题" />
<TextView
android:id="@+id/item_abstr"
android:layout_width="match_parent"
android:layout_height="82dp"
android:layout_alignParentStart="true"
android:layout_below="@+id/item_header"
android:layout_weight="2"
android:text="简介" />
</RelativeLayout>
</RelativeLayout>
接下来创建adapter,这里卡了很久,一直会闪退,最后发现是onCreateViewHolder中View.inflate和LayoutInflater.from(context).inflate的区别区别:
public class MyRecycleviewAdapter extends RecyclerView.Adapter<MyRecycleviewAdapter.MyViewHolder> {
Context context;
List<ArticleItem> articles=new ArrayList<>();
public MyRecycleviewAdapter(Context context, List<ArticleItem> articles) {
this.context = context;
this.articles = articles;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
// MyViewHolder holder = new MyViewHolder(View.inflate(context, R.layout.article_item, null));
// return holder;
MyViewHolder holder = new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.article_item, viewGroup, false)); //传入的是item布局
return holder;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {
ArticleItem articleItem=articles.get(i);
myViewHolder.title.setText(articleItem.getTitle());
myViewHolder.abs.setText(articleItem.getAbstract());
myViewHolder.image.setImageResource(R.drawable.ic_launcher_background);
}
@Override
public int getItemCount() {
return articles.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
private ImageView image;
private TextView title;
private TextView abs;
public MyViewHolder(@NonNull final View itemView) {
super(itemView);
image=(ImageView)itemView.findViewById(R.id.item_image);
title=(TextView)itemView.findViewById(R.id.item_header);
abs=(TextView)itemView.findViewById(R.id.item_abstr);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context,"1111111",Toast.LENGTH_LONG).show();
}
});
}
}
}
接下来在fragment1布局文件中添加recycleview,修改fragment1:
public class BlankFragment extends Fragment {
RecyclerView recyclerView;
MyRecycleviewAdapter recycleviewAdapter;
private List<ArticleItem> items = new ArrayList<>();
View view;
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_blank, container, false); //传入的是fragment布局
initData(); //初始化数据
initRecyclerView(); //配置recycleview
return view;
}
private void initData() {
for (int i=0;i<10;i++){
ArticleItem articleItem=new ArticleItem();
articleItem.setTitle("新闻"+String.valueOf(i));
articleItem.setAbstract("简介XXXXXX"+String.valueOf(i));
items.add(articleItem);
}
}
private void initRecyclerView() {
recyclerView=(RecyclerView)view.findViewById(R.id.main_recycle);
recycleviewAdapter=new MyRecycleviewAdapter(this.getActivity(),items); //注意getactivity和getcontext区别
LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this.getActivity(),LinearLayoutManager.VERTICAL,false);
recyclerView.setLayoutManager(linearLayoutManager); //必要
recyclerView.setAdapter(recycleviewAdapter); //必要
}
}
结果: