2014-11-20 4 views
1

Мне нужно изменить вид на салфетки. Это можно получить через просмотр пейджера. Но у меня 60 просмотров, и создание 60 разных фрагментов не будет хорошим подходом. Пожалуйста, кто-нибудь поможет мне, что будет лучшим способом для разработки swiping 60 просмотров.View Pager с огромным количеством фрагментов

+0

только один класс фрагмент необходим. передайте параметры из вашего FragmentPagerAdapter в фрагмент. таким образом, разные экземпляры одного и того же класса создаются для разных параметров. – Ali

+0

@Ali Это не решит проблему использования памяти. Там будет много экземпляров этого определенного класса. См. Мой ответ. – EyesClear

ответ

1

Во-первых, создать один фрагмент, где можно надуть различные точки зрения, используя параметр «позиции», как следовать ..

public class SuperAwesomeCardFragment extends Fragment { 

private static final String ARG_POSITION = "position"; 

private int position; 
View mainView; 

public static SuperAwesomeCardFragment newInstance(int position) { 
    SuperAwesomeCardFragment f = new SuperAwesomeCardFragment(); 
    Bundle b = new Bundle(); 
    b.putInt(ARG_POSITION, position); 
    f.setArguments(b); 
    return f; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    position = getArguments().getInt(ARG_POSITION); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)   { 

    if(position==1){ 

    mainview = inflater.inflate(R.layout.layout1, null); 

    }else if(position==2){ 

    mainview =inflater.inflate(R.layout.layout2, null); 
    . 
    . 
    . 
    . 
    }else if(position==50){ 

    mainview =inflater.inflate(R.layout.layout50, null); 
    } 

return mainView;  
} 

}

Теперь в вашем MainActivity Создать адаптер, который расширяет FragmentPagerAdpater и в GetItem() Способ создания экземпляров ранее создать фрагмент, как следовать

public class MyPagerAdapter extends FragmentPagerAdapter { 

    private final String[] TITLES = { "Title1", "Title2"...., "Title50"}; 

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

    @Override 
    public CharSequence getPageTitle(int position) { 
     return TITLES[position]; 
    } 

    @Override 
    public int getCount() { 
     return TITLES.length; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return SuperAwesomeCardFragment.newInstance(position); 
    } 

} 

}

Тогда, наконец, добавить это в методе вашей деятельности в OnCreat() ...

MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager()); 
yourViewPager.setAdapter(adapter); 

Таким образом, вы должны создать один фрагмент и использовать его для нескольких представлений. Спасибо. Надеюсь, поможет..!!

+0

не вызовет ли утечка памяти? – megha

+0

Нет, не будет. Поскольку GC сбрасывает фрагменты, которые не видны, если вы не установили offscreenlimit. – iMDroid

+0

Спасибо за помощь ... – megha

0

Вы можете безопасно использовать ViewPager с реализацией FragmentStatePagerAdapter. Адаптер оптимизирует использование памяти, уничтожая фрагменты, которые не видны в данный момент. Check the documentation для получения более подробной информации и кода.

0

Ниже приведен полный код для добавления фрагментов в пейджер View. Поскольку это всего лишь демонстрация, я использовал только текстовое изображение, и каждый добавленный фрагмент будет иметь случайный цвет. Нажав кнопку, вы можете добавить столько фрагментов, сколько захотите. При нажатии на страницу вы можете просто удалить ее из View Pager . Вы можете перемещаться с одной страницы на другую в панели просмотра, используя Swiping вправо или влево.

MainActivity.java

import android.graphics.Color; 
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.FragmentStatePagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.View; 
import android.widget.Button; 
import java.util.ArrayList; 
import java.util.Random; 

public class MainActivity extends FragmentActivity { 

    private MyPagerAdapter mpg; 
    private ArrayList<MyFragment> fragmentlist = new ArrayList<>(); 
    public FragmentManager fmr = getSupportFragmentManager(); 

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

     final ViewPager pager = (ViewPager) findViewById(R.id.viewPager); 
     mpg = new MyPagerAdapter(fmr,fragmentlist); 
     pager.setAdapter(mpg); 

     for (int q = 0; q < 5; q++) { 
      int r = new Random().nextInt(100) + 155; 
      int g = new Random().nextInt(100) + 155; 
      int b = new Random().nextInt(100) + 155; 
      fragmentlist.add(MyFragment.newInstance(q, "Page number: " + (q + 1), Color.rgb(r, g, b))); 
      mpg.notifyDataSetChanged(); 
     } 

     Button B1 = (Button) findViewById(R.id.button); 
     B1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       int r = new Random().nextInt(100) + 155; 
       int g = new Random().nextInt(100) + 155; 
       int b = new Random().nextInt(100) + 155; 
       int count = mpg.getCount(); 
       fragmentlist.add(MyFragment.newInstance(count, "Page number: " + (count+1), Color.rgb(r, g, b))); 
       mpg.notifyDataSetChanged(); 

      } 
     }); 
    } 

    public void delete(int pos) { 

     int i = 0; 
     while (i <= fragmentlist.size()) { 
      if (pos == fragmentlist.get(i).getPosition()) break; 
      i++; 

     } 

     fragmentlist.remove(i); 
     mpg.notifyDataSetChanged(); 
    } 

    public class MyPagerAdapter extends FragmentStatePagerAdapter { 

     private ArrayList<MyFragment> fragmentList; 
     public MyPagerAdapter(FragmentManager fm, ArrayList<MyFragment> f) { 
      super(fm); 
      this.fragmentList = f; 
     } 

     @Override 
     public Fragment getItem(int pos) { 
      return fragmentlist.get(pos); 
     } 

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

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

MyFragment.java

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

import java.util.List; 

public class MyFragment extends Fragment { 

    int pos; 

    @Override 
    public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.f_1, container, false); 
     pos = getArguments().getInt("num"); 
     v.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       Log.v("MainActivity", "Deleting at pos - " + pos); 
       MainActivity activity = (MainActivity) getActivity(); 
       activity.delete(pos); 
      } 
     }); 

     TextView tv = (TextView) v.findViewById(R.id.tvFragFirst); 
     FrameLayout fl = (FrameLayout) v.findViewById(R.id.frame_layout); 
     tv.setText(getArguments().getString("msg")); 
     fl.setBackgroundColor(getArguments().getInt("colour")); 
     return v; 
    } 

    public int getPosition() { 
     return pos; 
    } 

    public static MyFragment newInstance(int num,String text,int clr) { 

     MyFragment f = new MyFragment(); 
     Bundle b = new Bundle(); 
     b.putString("msg", text); 
     b.putInt("colour", clr); 
     b.putInt("num",num); 
     f.setArguments(b); 
     return f; 
    } 
} 

И xml.files,

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.shakthivels.assingment10.MainActivity" 
    android:id="@+id/r_v" 
    > 

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

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="ADD a fragment" 
     android:id="@+id/button" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" /> 

</RelativeLayout> 

f_1.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:id="@+id/av" 
    > 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:id="@+id/frame_layout"> 

     <TextView 
      android:id="@+id/tvFragFirst" 
      android:layout_width="203dp" 
      android:layout_height="127dp" 
      android:layout_centerHorizontal="true" 
      android:layout_centerVertical="true" 
      android:textSize="26sp" 
      android:text="TextView" 
      android:layout_gravity="center" 
      android:textColor="#000000" /> 

    </FrameLayout> 
</RelativeLayout> 

Already Existing Fragment1 Newly added Fragment to the view Pager2

Смежные вопросы