我的适配器中有"内存泄漏"(引用将在后面解释).我目前正在使用嵌套片段来托管viewpager.
我的设置如下:
1.活动(托管片段A的空活动)
2.片段A - 使用Fragmentstatepageradapter托管viewpager的片段.每个viewpager页面都包含片段B.
3.片段B - 包含imageview的片段.
除非发生配置更改,否则一切都很好.监控堆,每次轮换发生时,它似乎增长100 kb.手动GCing不会释放内存.
我尝试过的事情:
1.用空白片段替换片段B - 出现同样的问题,因此不是造成问题的imageview.
2.删除片段A和B并旋转活动.没有发生内存泄漏,所以它不是活动.
3.在任何方向改变之前使用MAT并且在旋转大约50次之后使用MAT以使堆积起来.MAT显示了一个主要的嫌疑人,这是我的适配器类.它显示了7MB的保留堆(非常小的浅堆)观察者,如下所示:
array java.util.ArrayList @ 0x42079938 24 7,000,832
.\mObservers android.database.DataSetObservable @ 0x42053508 16 7,000,848
..\mObservable com.example.main.Adapter@ 0x4205a048 40 7,001,416
Run Code Online (Sandbox Code Playgroud)
为什么我在片段中使用viewpager:
1.我想通过设置setretaininstance(true)来保持适配器的状态以及与viewpager相关的其他变量.
2.配置更改后,我不重新创建适配器,而是使用旧的适配器连接到viewpager.
3.如果我不重用旧适配器但在配置更改后创建新适配器,则内存泄漏消失.
4.关闭活动并返回上一个活动后,内存泄漏也消失了.
有任何想法吗?非常感谢任何帮助.
谢谢,JC
android memory-leaks android-viewpager fragmentstatepageradapter
我在用:
activity 包含以fragment编程方式添加的布局.FragmentStatePagerAdapter视图寻呼机,所有内容都在里面ScrollView.问题是:
为此,我用过
viewpager.getLayoutParams().height = 20000;
viewpager.requestLayout();`
Run Code Online (Sandbox Code Playgroud)
和
ViewGroup.LayoutParams params = viewPagerBottom.getLayoutParams();
params.height = 20000;
viewPagerBottom.setLayoutParams(params);
Run Code Online (Sandbox Code Playgroud)
另外,我尝试过查看寻呼机和查看寻呼机片段高度属性 wrap_content
android:layout_height="match_parent",则看不到视图寻呼机内容android:fillViewport="true".它是父片段layout.xml.
<ScrollView
style="@style/scrollDefaultStyle"
android:layout_height="wrap_content"
android:fillViewport="true"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TabLayout .... />
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
</ScrollView>
Run Code Online (Sandbox Code Playgroud) android scrollview android-fragments android-viewpager fragmentstatepageradapter
我一直在读很多片段.发现其他人在检索片段视图时遇到问题,因为总是返回null,但没有答案解决了我的问题.我要做的是创建一个图库.我有一个包含图像视图的片段.为了显示片段,我使用了android.support.v4.view.ViewPager.而喂ViewPager我使用一个android.support.v4.app.FragmentStatePagerAdapter.
问题是,当所有内容都构建并显示图像时,我想将当前显示的图像保存到磁盘.所以我需要得到当前的片段imageview,但我不能,因为fragment.getView()总是为null,与片段相关的活动也是null,我无法弄清楚它为什么.这里有一些代码,看看是否有人可以帮助:
这是我的片段:
public class ImageViewURLFragment extends Fragment
{
String _url;
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState)
{
// The last two arguments ensure LayoutParams are inflated
// properly.
View rootView = new ImageViewURL(getActivity(), _url);
return rootView;
}
public void setImageURL(String imgURL)
{
_url=imgURL;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的适配器:
public class ImageViewURLCustomAdapter extends FragmentStatePagerAdapter
{
List<String> _urls=new ArrayList<String>();
public ImageViewURLCustomAdapter(FragmentManager fm)
{
super(fm);
}
@Override
public Fragment getItem(int i)
{
ImageViewURLFragment fragment = new ImageViewURLFragment(); …Run Code Online (Sandbox Code Playgroud) android android-layout android-fragments fragmentstatepageradapter
我有一个应用程序启动时ViewPager填充的内容FragmentStatePagerAdapter:
ViewPager mViewPager;
...
@Override
public void onViewCreated(View view, Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
mViewPager.setAdapter(new PageAdapter(getChildFragmentManager()));
//PageAdapter extends from FragmentStatePagerAdapter
}
Run Code Online (Sandbox Code Playgroud)
这应该很好.
现在,当用户更改应用程序的设置时,我想将新的适配器分配给ViewPager,如下所示:
@Override
public void updateObserver(SETTING_KEY key)
{
mViewPager.setAdapter(new PageAdapter(getChildFragmentManager()));
Log.d("info", "updating");
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,在调用updateObserver此异常后应用程序崩溃:
01-22 23:22:45.957:E/AndroidRuntime(13131):FATAL EXCEPTION:main 01-22 23:22:45.957:E/AndroidRuntime(13131):java.lang.IllegalStateException:键f0不再存在Fragement: index 0 01-22 23:22:45.957:E/AndroidRuntime(13131):在android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:575)01-22 23:22:45.957:E/AndroidRuntime( 13131):在android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:211)01-22 23:22:45.957:E/AndroidRuntime(13131):在android.support.v4.view.ViewPager.onRestoreInstanceState (ViewPager.java:1281)01-22 23:22:45.957:E/AndroidRuntime(13131):at android.view.View.dispatchRestoreInstanceState(View.java:13188)01-22 23:22:45.957:E/AndroidRuntime (13131):在android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2850)01-22 23:22:45.957:E/AndroidRuntime(13131):at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2856) 01-22 23:22:45.957:E/AndroidRuntime(13131):在andro id.view.View.restoreHierarchyState(View.java:13166)01-22 23:22:45.957:E/AndroidRuntime(13131):在android.support.v4.app.Fragment.restoreViewState(Fragment.java:425). ..
如何在ViewPager不崩溃应用程序的情况下为新的适配器分配?
问题:如何获取ViewPager FragmentStatePagerAdapter的当前视图?
FragmentStatePagerAdapter是必需的,不是PagerAdapter.
instantiateItem(View container, int position).这适用于PagerAdapter.FragmentStatePagerAdapter该instantiateItem有一个ViewGroup PARAM 没有 查看 PARAM:instantiateItem(**ViewGroup** container, int position)所以我希望这不是不可能,是吗?请帮忙!
我正在使用一个包含5页的FragmentStatePagerAdapter的ViewPager.
在第一页中,我有一个带有项目的ListView.当我在ViewPager的最后一页更改,然后我回到第一页时,我的ListView为空,因为已重新创建了适配器.
Android总是调用下一个方法:onAttach(),onCreate(),onCreateView(),onViewCreated(),onActivityCreated(),onStart()和onResume().
我想不要使用ViewPager.setOffscreenPageLimit()方法来避免我的页面被销毁.还有其他解决方案吗?
我想要的行为与Facebook相同.
我做错了什么?如何将数据保存在ListView中?
我的FragmentStatePageAdapter的代码:
public class AdapterMain extends FragmentStatePagerAdapter {
List<ChicfyFragment> fragments = new ArrayList<ChicfyFragment>();
public AdapterMain(FragmentManager fm) {
super(fm);
fragments.add(new FragmentShop());
fragments.add(new FragmentSearch());
fragments.add(new FragmentSell());
fragments.add(new FragmentNotification());
fragments.add(new FragmentProfile());
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
}
Run Code Online (Sandbox Code Playgroud)
我的ViewPager第一页的代码:
public class FragmentShop extends ChicfyFragment implements SwipeRefreshLayout.OnRefreshListener {
ListView mListView;
AdapterProductList mAdapter;
SwipeRefreshLayout mSwipeRefreshLayout;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, …Run Code Online (Sandbox Code Playgroud) android android-listview android-fragments android-viewpager fragmentstatepageradapter
我正在尝试使用与view pager + tabsPlayStore 5.1.x 相同的设计.这是我的布局:
<?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:layout_gravity="center_vertical|center_horizontal"
android:gravity="center_vertical|center_horizontal"
android:orientation="vertical">
<com.astuetz.PagerSlidingTabStrip
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@drawable/background_tabs" />
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
我的适配器:
public class MainPagerAdapter extends FragmentStatePagerAdapter {
private ArrayList<FakeFragment> fragments;
public MainPagerAdapter(FragmentManager fm) {
super(fm);
// TODO Auto-generated constructor stub
fragments = new ArrayList<FakeFragment>();
}
@Override
public Fragment getItem(int position) {
// TODO Auto-generated method stub
if(position < getCount()) {
FakeFragment fragment = FakeFragment.newInstance(position);
fragments.add(fragment);
}
return fragments.get(position);
}
@Override …Run Code Online (Sandbox Code Playgroud) 似乎之前讨论过刷新问题,但没有一个解决方案适合我.
我想做的是: 我正在使用FragmentStatePagerAdapter.适配器的每个位置都包含一个片段,该片段具有象棋状态的线性布局,每个单元格由CheckedTextView表示.
并且应该侦听单击并且删除单元格上的先前选择并进行新选择的侦听器.
什么工作: 每个片段都正确加载所有数据/默认状态(在片段加载到列表时计算)
当我单击一个单元格时,保存的单元格列表中的所有状态都被正确获取,我可以在调试时更改代码中的状态更改.同时我为CheckedTextView指定一个表示单元格的新状态.设置如下:
CheckedTextView cellView = (CheckedTextView) GridRow.getChildAt(c);
cellView.setSelected(false);
cellView.setChecked(false);
cellView.setTag(cellsChess.get(i).get(c));
Run Code Online (Sandbox Code Playgroud)
问题: 即使正确存储和分配了值,也无法刷新视图,视图中单元格的值不会更新.
我试过的提示没有用: 1.调用adapter.notifyDataSetChanged: 只有当我们被覆盖时才可以在使用FragmentStatePagerAdapter时调用:
@Override
public int getItemPosition(Object object){
return POSITION_NONE;
}
Run Code Online (Sandbox Code Playgroud)
2.为DestroyItem添加Overriden方法,并将片段添加到getItem上的Map:
这不适合我正在使用FragmentStatePagerAdapter,因此使用此pagerAdapter的整个目的都将消失.
3.调用invalidate: 这不适合这种情况,我需要实时刷新.
4. instantiateItem()中的setTag()方法: 我不认为这种情况适合.
引用的线程: 在恢复活动时刷新FragmentStatePagerAdapter上的图像
notifyDataSetChanged无法更新ListView
我试图尽可能清楚地说明我的问题,如果有人需要更多澄清,请问.
紧急回复将受到高度赞赏,
干杯
****更新*****
我使用的是ViewPagerIndicator,而不是默认的ViewPager.
android checkedtextview android-fragments android-viewpager fragmentstatepageradapter
介绍
我有一个Book的活动,其中包含一个类型为"page"的arraylist,并处理我决定使用FragmentStatePagerAdapter的所有页面,其中我的一个片段包含一个页面.
我为寻呼机中的每个片段和父活动之间的通信创建了一个接口.我在这个接口中需要的方法是更新页面中显示的页面,所以我为父活动创建了工具,用于从片段接收数据的接口并将它们存储在页面中以保存在arraylist中.
每个片段都有一个EditText,用户可以在其中编写,我设置addTextChangedListener来捕获用户停止写入的时刻.当用户停止在EditText中写入时,在onTextChanged()中,我调用activity father中实现的函数.
这是我的活动代码
public class BookEditorActivity implements BookEditorFragment.EditorFrToEditorActInterface {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.book_editor_activity);
Bundle extras = getIntent().getExtras();
b = (Book) extras.get("book");
setBookViewPager(b);
}
private void setBookViewPager(Book b) {
mBookViewPager = (ViewPager) findViewById(R.id.book_editor_pager);
mBookViewPagerAdapter = new BookViewPagerAdapter(getSupportFragmentManager(), b);
mBookViewPager.setAdapter(mBookViewPagerAdapter);
}
@Override
public void saveBookPageTextContent(String textContent) {
int current = mBookViewPager.getCurrentItem();
if (b.getPages().get(current) instanceof BookPageText) {
((BookPageText) b.getPages().get(current)).setContentPageText(textContent);
}
}
@Override
public void newBookPageText() {
int current = mBookViewPager.getCurrentItem();
BookPageText bookPageText = new BookPageText();
bookPageText.setContentPageText(""); …Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager fragmentstatepageradapter
我需要在RecyclerView中有一个ViewPager(类似于水平图库),它垂直显示一个列表.RecyclerView的每一行都有一个ViewPager,允许在某些图像之间滑动.ViewPager还将支持点击事件,这些点击事件将传播到父级RecyclerView.
目前,我有以下实现:
列表适配器:
@Override
public void onBindViewHolder(MyHolder holder, int position) {
super.onBindViewHolder(holder, position);
Item listItem = get(position);
...
GalleryAdapter adapter =
new GalleryAdapter(getActivity().getSupportFragmentManager(),
item.mediaGallery);
holder.imageGallery.setAdapter(adapter);
...
}
Run Code Online (Sandbox Code Playgroud)
图库适配器:
public class GalleryAdapter extends FragmentStatePagerAdapter {
private final List<Item.Gallery> mItems;
@Bind(R.id.gallery_item)
ImageView galleryView;
public SearchResultsGalleryPagerAdapter(FragmentManager fm, @NonNull ArrayList<Item.Gallery> mediaGallery) {
super(fm);
mItems = mediaGallery;
}
@Override
public Fragment getItem(int position) {
GalleryFragment fragment = GalleryFragment.newInstance(mItems.get(position));
...
return fragment;
}
@Override
public int getCount() {
return null == mItems ? 0 : mItems.size(); …Run Code Online (Sandbox Code Playgroud) android android-fragments android-viewpager fragmentstatepageradapter android-recyclerview