TabLayout + ViewPager + Fragment 实现动态框架

转载自:https://blog.csdn.net/qq_16666847/article/details/53291941

我只设置了两个fragment显示,简单明了。

一. 导入依赖

compile 'com.android.support:appcompat-v7:24.2.0'
compile 'com.android.support:design:24.2.0'

二. xml布局

activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.design.widget.TabLayout
        android:id="@+id/tabLayout"
        android:layout_width="match_parent"
        android:layout_height="50dp" />

    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:text="fragment1"
        android:background="#c1c1c1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

</LinearLayout>

三. fragment

两个Fragment 格式一样,这里我就放一个吧

package com.jmg.viewpagerfragment;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment1 extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_layout1, container, false);
    }
}

四. 设置fragment工厂

package com.jmg.viewpagerfragment;

import android.support.v4.app.Fragment;

public class FragmentFactory {
    public static Fragment getFragment(int position) {
        Fragment fragment = null;
        switch (position) {
            case 0:
                fragment = new Fragment1();
                break;
            case 1:
                fragment = new Fragment2();
                break;
        }
        return fragment;
    }
}

五. MainActivity.java实现

package com.jmg.viewpagerfragment;

import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    TabLayout tab;
    ViewPager viewpager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tab = (TabLayout) findViewById(R.id.tabLayout);
        viewpager = (ViewPager) findViewById(R.id.viewPager);

        viewpager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tab));
        tab.setupWithViewPager(viewpager);    //tab和viewPager绑定
        setAdapter();
    }
    private void setAdapter() {
        viewpager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public Fragment getItem(int position) {
                return FragmentFactory.getFragment(position);
            }

            @Override
            public int getCount() {
                return 2;        //tab的个数
            }

            @Override
            public CharSequence getPageTitle(int position) {
                String[] str = new String[]{"首页", "应用"};    //tab显示的文字,数量要相同
                return str[position];
            }
        });
    }
}
每天进步一点点!


下面是一个简单的实现购物页面的示例: 1. 在布局文件中添加TabLayout和ViewPager2: ``` <com.google.android.material.tabs.TabLayout android:id="@+id/tab_layout" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabMode="fixed" app:tabGravity="fill"/> <androidx.viewpager2.widget.ViewPager2 android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` 2. 在Activity中设置ViewPager2的Adapter,并将Adapter和TabLayout关联起来: ``` val adapter = ShoppingPagerAdapter(this) view_pager.adapter = adapter TabLayoutMediator(tab_layout, view_pager) { tab, position -> when (position) { 0 -> tab.text = "推荐" 1 -> tab.text = "食品" 2 -> tab.text = "百货" } }.attach() ``` 3. 在PagerAdapter中实现每个页面的布局和逻辑: ``` class ShoppingPagerAdapter(activity: FragmentActivity) : FragmentStateAdapter(activity) { override fun getItemCount() = 3 override fun createFragment(position: Int): Fragment { return when (position) { 0 -> RecommendFragment() 1 -> FoodFragment() 2 -> GoodsFragment() else -> throw IllegalArgumentException("Invalid position") } } } ``` 4. 在每个Fragment实现商品列表的布局和逻辑: ``` class RecommendFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val view = inflater.inflate(R.layout.fragment_recommend, container, false) val recyclerView = view.findViewById<RecyclerView>(R.id.recycler_view) recyclerView.adapter = RecommendAdapter(requireContext(), listOf( Product(R.drawable.product1, "商品1", "介绍1", 10.0), Product(R.drawable.product2, "商品2", "介绍2", 20.0), Product(R.drawable.product3, "商品3", "介绍3", 30.0), Product(R.drawable.product4, "商品4", "介绍4", 40.0) )) recyclerView.layoutManager = GridLayoutManager(requireContext(), 2) return view } } class RecommendAdapter(private val context: Context, private val productList: List<Product>) : RecyclerView.Adapter<RecommendAdapter.ProductViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProductViewHolder { val view = LayoutInflater.from(context).inflate(R.layout.item_product, parent, false) return ProductViewHolder(view) } override fun getItemCount() = productList.size override fun onBindViewHolder(holder: ProductViewHolder, position: Int) { val product = productList[position] holder.imageView.setImageResource(product.imageResId) holder.nameView.text = product.name holder.descView.text = product.description holder.priceView.text = "¥${product.price}" holder.itemView.setOnClickListener { val intent = Intent(context, ProductDetailActivity::class.java) intent.putExtra("product", product) context.startActivity(intent) } } class ProductViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val imageView: ImageView = itemView.findViewById(R.id.image_view) val nameView: TextView = itemView.findViewById(R.id.name_view) val descView: TextView = itemView.findViewById(R.id.desc_view) val priceView: TextView = itemView.findViewById(R.id.price_view) } } ``` 5. 实现商品详情页的布局和逻辑: ``` class ProductDetailActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_product_detail) val product = intent.getParcelableExtra<Product>("product")!! findViewById<ImageView>(R.id.image_view).setImageResource(product.imageResId) findViewById<TextView>(R.id.name_view).text = product.name findViewById<TextView>(R.id.price_view).text = "¥${product.price}" findViewById<TextView>(R.id.desc_view).text = product.description findViewById<Button>(R.id.buy_button).setOnClickListener { val intent = Intent(this, ShoppingCartActivity::class.java) startActivity(intent) } } } ``` 6. 实现购物车页面的布局和逻辑: ``` class ShoppingCartActivity : AppCompatActivity() { private val productList = mutableListOf<Product>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_shopping_cart) findViewById<Button>(R.id.add_button).setOnClickListener { productList.add(Product(R.drawable.product1, "商品1", "介绍1", 10.0)) updateList() } findViewById<Button>(R.id.delete_button).setOnClickListener { productList.removeAt(productList.lastIndex) updateList() } updateList() } private fun updateList() { findViewById<TextView>(R.id.total_price_view).text = "¥${productList.sumByDouble { it.price }}" findViewById<RecyclerView>(R.id.recycler_view).adapter = ShoppingCartAdapter(this, productList) } } class ShoppingCartAdapter(private val context: Context, private val productList: List<Product>) : RecyclerView.Adapter<ShoppingCartAdapter.ProductViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ProductViewHolder { val view = LayoutInflater.from(context).inflate(R.layout.item_shopping_cart, parent, false) return ProductViewHolder(view) } override fun getItemCount() = productList.size override fun onBindViewHolder(holder: ProductViewHolder, position: Int) { val product = productList[position] holder.imageView.setImageResource(product.imageResId) holder.nameView.text = product.name holder.priceView.text = "¥${product.price}" holder.itemView.setOnClickListener { productList.removeAt(position) notifyItemRemoved(position) notifyItemRangeChanged(position, productList.size - position) (context as ShoppingCartActivity).updateList() } } class ProductViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val imageView: ImageView = itemView.findViewById(R.id.image_view) val nameView: TextView = itemView.findViewById(R.id.name_view) val priceView: TextView = itemView.findViewById(R.id.price_view) } } ``` 以上是一个简单的实现购物页面、商品详情页和购物车页面的示例。实际项目中可能需要更复杂的逻辑和界面设计,但基本思路是相似的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值