2015-06-18 10 views
0

我正在開發類似於ViewPager的東西,但我不知道元素的精確計數。
我知道只有一個元素,我應該立即加載。 同時我應該將數據加載到右側和左側片段(我正從服務器根據可見片段加載左側和右側)。
因此,用戶可以向左或向右滑動(與典型的ViewPager一樣),並且動態地確定我應該加載哪些數據。我有3個片段,但其中2個不在屏幕的邊緣

它看起來像http://i.stack.imgur.com/X2fti.png

從理論上講,我應該創造這樣的僞方法:

void loadLeftFragment(MainFragmentData); 
void loadRightFragment(MainFragmentData) 
void loadMainFragment(); 

此外,我要根據監聽左右滑動手勢和數據加載到所有碎片滑動。
另外,這個過程應該有一些動畫。

因此,您可以介紹一下如何創建這個或我可以在哪裏讀取/查看任何適當的信息?

+0

你所描述的是視圖尋呼機做什麼。你爲什麼試圖重新發明輪子?如果你真的想要你可以先看看[ViewPager源代碼](http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android /support/v4/view/ViewPager.java) – Naveed

+0

@Naveed我不想讓輪子 - 爲什麼我在尋求幫助。正如我所說的ViewPager DOES需要適配器,它知道元素的數量。我不知道他們的計數(我正在從互聯網上下載它們,並將其放入正確或左側(如果我已收到數據)片段) – AndriiGenesis

+0

您仍然可以使用視圖尋呼機創建它並具有初始計數。您的數據集可以隨時增加。隨着更多的數據進來,你可以調用'notifyDatasetChanged'來讓適配器知道更多的數據進來了。 – Naveed

回答

0

ViewPager與多個片段和佈局文件 - 如何

以下是如何實現ViewPager不同的片段類型和不同的佈局文件的完整例子。 在這種情況下,我有3個片段類,每個類都有不同的佈局文件。爲了簡單起見,片段佈局僅在背景顏色上有所不同。當然,任何佈局文件都可以用於碎片。

FirstFragment.java具有橙色背景佈局,SecondFragment.java具有綠色背景佈局,ThirdFragment.java具有紅色背景佈局。此外,每個片段顯示不同的文本,具體取決於它來自哪個類別以及它是哪個實例。

另請注意,我正在使用support-library的Fragment:android.support.v4.app.Fragment MainActivity.java(初始化Viewpager並將其作爲內部類的適配器)。再次看看進口。我正在使用android.support.v4軟件包。

import android.os.Bundle; 
    import android.support.v4.app.Fragment; 
    import android.support.v4.app.FragmentActivity; 
    import android.support.v4.app.FragmentManager; 
    import android.support.v4.app.FragmentPagerAdapter; 
    import android.support.v4.view.ViewPager; 

public class MainActivity extends FragmentActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main);  

     ViewPager pager = (ViewPager) findViewById(R.id.viewPager); 
     pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager())); 
    } 

    private class MyPagerAdapter extends FragmentPagerAdapter { 

     public MyPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int pos) { 
      switch(pos) { 

      case 0: return FirstFragment.newInstance("FirstFragment, Instance 1"); 
      case 1: return SecondFragment.newInstance("SecondFragment, Instance 1"); 
      case 2: return ThirdFragment.newInstance("ThirdFragment, Instance 1"); 
      case 3: return ThirdFragment.newInstance("ThirdFragment, Instance 2"); 
      case 4: return ThirdFragment.newInstance("ThirdFragment, Instance 3"); 
      default: return ThirdFragment.newInstance("ThirdFragment, Default"); 
      } 
     } 

     @Override 
     public int getCount() { 
      return 5; 
     }  
    } 
} 

activity_main.xml中(該MainActivitys .xml文件) - 一個簡單的佈局文件,僅包含填充整個屏幕的ViewPager。

<android.support.v4.view.ViewPager 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/viewPager" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    /> 

片段類,FirstFragment.java import android.support.v4.app.Fragment;

public class FirstFragment extends Fragment { 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.first_frag, container, false); 

     TextView tv = (TextView) v.findViewById(R.id.tvFragFirst); 
     tv.setText(getArguments().getString("msg")); 

     return v; 
    } 

    public static FirstFragment newInstance(String text) { 

     FirstFragment f = new FirstFragment(); 
     Bundle b = new Bundle(); 
     b.putString("msg", text); 

     f.setArguments(b); 

     return f; 
    } 
} 

first_frag.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@android:color/holo_orange_dark" > 

    <TextView 
     android:id="@+id/tvFragFirst" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     android:textSize="26dp" 
     android:text="TextView" /> 
</RelativeLayout> 

SecondFragment.java

public class SecondFragment extends Fragment { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.second_frag, container, false); 

    TextView tv = (TextView) v.findViewById(R.id.tvFragSecond); 
    tv.setText(getArguments().getString("msg")); 

    return v; 
} 

public static SecondFragment newInstance(String text) { 

    SecondFragment f = new SecondFragment(); 
    Bundle b = new Bundle(); 
    b.putString("msg", text); 

    f.setArguments(b); 

    return f; 
} 
} 

second_frag.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@android:color/holo_green_dark" > 

    <TextView 
     android:id="@+id/tvFragSecond" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     android:textSize="26dp" 
     android:text="TextView" /> 

</RelativeLayout> 

ThirdFragment。java的

public class ThirdFragment extends Fragment { 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.third_frag, container, false); 

    TextView tv = (TextView) v.findViewById(R.id.tvFragThird);  
    tv.setText(getArguments().getString("msg")); 

    return v; 
} 

public static ThirdFragment newInstance(String text) { 

    ThirdFragment f = new ThirdFragment(); 
    Bundle b = new Bundle(); 
    b.putString("msg", text); 

    f.setArguments(b); 

    return f; 
} 
} 

third_frag.xml

<?xml version="1.0" encoding="utf-8"?> 
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@android:color/holo_red_light" > 

     <TextView 
      android:id="@+id/tvFragThird" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerHorizontal="true" 
      android:layout_centerVertical="true" 
      android:textSize="26dp" 
      android:text="TextView" /> 

    </RelativeLayout> 
+0

檢查此動畫https://github.com/ToxicBakery/ViewPagerTransforms –

+0

謝謝,但是,可能,我隱式描述一個問題。在你的例子中,你有5個要顯示的元素。我有多達數千人,但我沒有線索他們,直到我加載第一個。所以,我動態地要求我的服務器爲左側和右側片段提供數據。至於右邊的部分很簡單(只需將新數據添加到適配器)。但對於左側部分,我不知道如何動態添加。 – AndriiGenesis