viewpager和recycleview

本文介绍如何在安卓应用中使用ViewPager实现滑动切换Fragment,并通过RecyclerView展示动态列表。详细讲解了ViewPager与Fragment的结合,RecyclerView的Adapter创建及item布局设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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,String.valueOf(getAdapterPosition()),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);				//必要

    }
}

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

介绍:一个基于RecyclerView实现的ViewPager,支持类似于gallary的fling操作。点击上面"下载源码" 按钮,可以下载完整的demo。其中recyclerview是android-support中的依赖项目,RecyclerViewPager是主项目。运行效果:使用说明:继承自 RecyclerView.自定义 fling factor.自定义 paging trigger.支持 水平个垂直方向.支持 FragmentViewPager (api 12 )gradlecompile('com.lsjwzh:recyclerviewpager:1.0.2')xml:java:final RecyclerViewPager mRecyclerView = (RecyclerViewPager) this.findViewById(R.id.recyclerViewPager); LinearLayoutManager layout = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL,false);//LinearLayoutManager.HORIZONTAL 设置水平滚动 mRecyclerView.setLayoutManager(layout); //set adapter mRecyclerView.setAdapter(new MyRecyclerAdapter());static class MyRecyclerAdapter extends RecyclerView.Adapter { private List items = new ArrayList(); public MyRecyclerAdapter(){ //创建4个页面 for(int i = 1; i<5; i ){ items.add("页面" i); } } public static class ViewHolder extends RecyclerView.ViewHolder{ public ViewHolder(View itemView) { super(itemView); } } @Override public int getItemCount() { // TODO Auto-generated method stub return items.size(); } @Override public void onBindViewHolder(ViewHolder holder, int position) { String item = items.get(position); TextView msgTv = (TextView)holder.itemView.findViewById(R.id.msg); msgTv.setText(item); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if(inflate == null) inflate = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = (LinearLayout)(inflate.inflate(R.layout.item, null)); return new 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值