viewpager和recycleview

一、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);				//必要

    }
}

结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41617275/article/details/89479716