您的位置:首页 > 移动开发 > Android开发

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

2015-12-28 23:51 731 查看
    距离上次发博客好像已经至少有两个月的时间了,不禁感叹时间过得真快,也是因为项目一直在忙,所以没来发博客,今天有闲情就来一发。好了,废话不多说,今天讲的是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();
}
}


运行结果图我就不贴了,后面我再把源码补充上去。点击此处下载源码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android viewpager fragment