Android viewpager+fragment实现动态加载碎片(fragment重复使用)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010214991/article/details/50422457
    距离上次发博客好像已经至少有两个月的时间了,不禁感叹时间过得真快,也是因为项目一直在忙,所以没来发博客,今天有闲情就来一发。好了,废话不多说,今天讲的是fragment复用的问题,提到碎片,相信大家都不陌生,fragment寄宿于Activity,依activity之存而存,依其销毁而销毁。今天我们大概要实现什么样的效果呢,那就是一个fragment
重复使用,通过点击界面上方的导航栏不同的标题向fragment传递不同的数据,从而达到动态加载fragment的目的。好了,下面直接看代码:


1.先来看看fragment的代码

import java.util.ArrayList;
import java.util.List;

import com.example.fm_reuse.R;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class TestFm extends Fragment{

	private List<String> list = new ArrayList<String>();
	private int flag;
	private TextView tv;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		Bundle bundle = this.getArguments();
		if(bundle != null){
			list = bundle.getStringArrayList("content");
			flag = bundle.getInt("flag");
		}
	}
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		View view = inflater.inflate(R.layout.fm_test, container,false);
		initView(view);
		return view;
	}
	
	public void initView(View view){
		tv = (TextView)view.findViewById(R.id.tv);
		tv.setText(list.get(flag));
	}
	
	
	public static TestFm newInstance(List<String> contentList,int flag){
		Bundle bundle = new Bundle();
		bundle.putStringArrayList("content", (ArrayList<String>) contentList);
		bundle.putInt("flag", flag);
		TestFm testFm = new TestFm();
		testFm.setArguments(bundle);
		return testFm;
		
	}
	
}


fm_test.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" >
    
    <TextView 
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:textSize="20sp"/>

</LinearLayout>



上面的代码很简单,newInstance这个方法在实例化fragment时将会用到,传入需要的数据并通过setArguments方法将数据保存,这样,当跳转到当前fragment时就可以在onCreate方法中通过getArguments拿到数据,就是这么的一个过程。下面我们来看一下MainActivity的代码:


import java.util.ArrayList;
import java.util.List;

import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;

import com.example.fm_reuse.adapter.FragmentVPAdapter;
import com.example.fm_reuse.fragment.TestFm;

public class MainActivity extends FragmentActivity {

	private List<String> titleList = new ArrayList<String>(); //标题链表
	private List<String> contentList = new ArrayList<String>(); //内容链表
	private List<TestFm> fragmentList = new ArrayList<TestFm>(); //碎片链表
	private int screenWidth; //屏幕宽度
	private ViewPager vp;
	private HorizontalScrollView scrollView;
	private List<TextView> textViews = new ArrayList<TextView>();
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		initList(); //初始化内容和标题
		
		//获取屏幕宽度
		WindowManager windowManager = this.getWindowManager();
		Display display = windowManager.getDefaultDisplay();
		screenWidth = display.getWidth();
		
		vp = (ViewPager)findViewById(R.id.viewPager);
		scrollView = (HorizontalScrollView)findViewById(R.id.scrollView);
		
		//有多少个标题就有多少个碎片,动态添加
		for(int i=0;i<titleList.size();i++){
			TestFm testFm = new TestFm().newInstance(contentList, i);
			fragmentList.add(testFm);
		}
		
		//初始化导航栏布局
		LinearLayout navigationLl = new LinearLayout(this);
		LinearLayout.LayoutParams mParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
		navigationLl.setLayoutParams(mParams);
		navigationLl.setOrientation(LinearLayout.HORIZONTAL);
		navigationLl.setBackgroundColor(Color.GREEN);
		
		//往导航栏添加标题
		if(titleList.size() <= 3){ //标题栏小于4个时,平分屏幕宽度
			 LinearLayout.LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
		        params.weight = 1;
		        for (int i = 0; i < titleList.size(); i++) {
	                final TextView tv = new TextView(this);
	                tv.setText(titleList.get(i));
	                tv.setGravity(Gravity.CENTER);
	                final int finalI = i;
	                tv.setOnClickListener(new View.OnClickListener() {
	                    @Override
	                    public void onClick(View view) {
	                        tv.setTextColor(Color.RED);
	                        vp.setCurrentItem(finalI);
	                    }
	                });
	                textViews.add(tv);
	                navigationLl.addView(tv, params); //往导航栏添加标题
	            }
		}
		
		if(titleList.size() > 3){ //标题大于四个,重新规划textView大小
			LinearLayout.LayoutParams params1 = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
	        params1.width = 300;
	        params1.height = LayoutParams.MATCH_PARENT;
	        
	        for (int i = 0; i < titleList.size(); i++) {
                final TextView tv = new TextView(this);
                tv.setText(titleList.get(i));
                tv.setGravity(Gravity.CENTER);
                final int finalI = i;
                tv.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        tv.setTextColor(Color.RED);
                        vp.setCurrentItem(finalI);
                    }
                });
                textViews.add(tv);
                navigationLl.addView(tv, params1);
            }
		}
		
		   //第一个标题默认红色
		  if (textViews != null && textViews.size() > 0) {
	            textViews.get(0).setTextColor(Color.RED);
	        }

	        scrollView.addView(navigationLl); //往scrollView添加导航栏
		
	        vp.setAdapter(new FragmentVPAdapter(getSupportFragmentManager(), (ArrayList<TestFm>) fragmentList));
	        vp.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
	            @Override
	            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

	            }

	            @Override
	            public void onPageSelected(int position) {
	                setSelect(position);
	                if(position>=4){
	                    scrollView.scrollBy((int) (0.25*screenWidth), 0);
	                }else if(position<4){
	                    scrollView.scrollBy(-(int) (0.25*screenWidth), 0);
	                }
	            }

	            @Override
	            public void onPageScrollStateChanged(int state) {

	            }
	        });
		
		
	}
	
	
	  public void setSelect(int position) {
	        vp.setCurrentItem(position);
	        for (int i = 0; i < textViews.size(); i++) {
	            textViews.get(i).setTextColor(Color.BLACK);
	        }
	        textViews.get(position).setTextColor(Color.RED);

	    }
	
	public void initList(){
		//添加标题
				titleList.add("标题一");
				titleList.add("标题二");
				titleList.add("标题三");
				titleList.add("标题四");
				titleList.add("标题五");
				titleList.add("标题六");
				
				//添加内容
				contentList.add("页面一");
				contentList.add("页面二");
				contentList.add("页面三");
				contentList.add("页面四");
				contentList.add("页面五");
				contentList.add("页面六");
	}


}

注释也写得很清楚了,所以就不多说了,相信大家都能看懂。

activity_main.xml

<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <HorizontalScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:fillViewport="true"
        android:scrollbars="none"
        >
    </HorizontalScrollView>

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

</LinearLayout>


最后把viewpager的适配器的代码也贴出来:

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentTransaction;

import java.util.ArrayList;

import com.example.fm_reuse.fragment.TestFm;

/**
 * Created by _H_JY on 2015/11/23.
 */


public class FragmentVPAdapter extends FragmentPagerAdapter {
    private ArrayList<TestFm> fragments;
    private FragmentManager fm;
    public FragmentVPAdapter(FragmentManager fm, ArrayList<TestFm> fragments) {
        super(fm);
        this.fm = fm;
        this.fragments = fragments;
    }

    public void setFragments(ArrayList<TestFm> fragments) {
        if(this.fragments != null){
            FragmentTransaction ft = fm.beginTransaction();
            for(Fragment f:this.fragments){
                ft.remove(f);
            }
            ft.commit();
            ft=null;
            fm.executePendingTransactions();
        }
        this.fragments = fragments;
        notifyDataSetChanged();
    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }

    @Override
    public Fragment getItem(int arg0) {
        return fragments.get(arg0);
    }

    @Override
    public int getCount() {
        return fragments.size();
    }
}


运行结果图我就不贴了,后面我再把源码补充上去。 点击此处下载源码


猜你喜欢

转载自blog.csdn.net/u010214991/article/details/50422457