我有PageAdapter
一周中的几天,对于每个寻呼机,我有相同的布局.我的问题是如何在更改日期时更新正确的listView.当我改变传呼机创建新的寻呼机并删除其他时,当发生这种情况时,我的列表视图指向新寻呼机而不是当前.例如,在wedneyday我保存列表视图的参考,当我在星期二改变周一寻呼机是创建和周四被删除,我的参考点,以最后一页创建(星期一),但我在星期二.
我的页面适配器:
ListView lvwConfig;
@Override
public Object instantiateItem(View pager, int position) {
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.pager_layout, null);
lvwConfig = (ListView) v.findViewById(R.id.lvwConfig);
((ViewPager) pager).addView(v, 0);
return v;
}
Run Code Online (Sandbox Code Playgroud)
我想ListView
总是指向当前项目的listview.
我有一个带有4个标签的viewpager ..在每个标签中都有一个片段.我的第一个选项卡是带有表单的片段(例如用户),在我单击保存后,数据将插入到数据库中.我的第二个选项卡是另一个带有表单的片段,但它使用第一个选项卡中的数据(我从数据库中获取它)来填充微调器.现在,在我从第一个选项卡成功插入数据后,在我的第二个选项卡中,微调器是空的.因为我的db查询是在第二个片段中的onCreateView()中实现的,所以在应用程序启动时只调用一次,因此在tab 1 i tab2之间的更改不会在onCreateView()甚至onResume()上启动.对我来说有趣的是,如果我转到tab4然后返回到tab2,我的数据正好在我的微调器中,所以不知何故从我当前的选项卡中刷出两个选项卡来刷新我的片段.我的问题是,当onCreateView()只调用一次时,如何才能对我的片段进行适当的刷新?
编辑 我试图把那个方法psykhi建议像这样:
this.mViewPager.setOffscreenPageLimit(0);
this.mViewPager.setAdapter(this.mPagerAdapter);
this.mViewPager.setOnPageChangeListener(this);
Run Code Online (Sandbox Code Playgroud)
但这对我不起作用.我错过了什么吗?
关于这个主题有很多讨论
我尝试了各种解决方案(包括失效POSITION_NONE
).但我仍然不知道如何正确删除项目.
会发生什么
instantiateItem
没有被要求替换)arraylist/sparsearray
这是我的适配器
private class DatePickerPagerAdapter extends FragmentStatePagerAdapter {
ArrayList<Fragment> registeredFragments = new ArrayList<Fragment>();
public DatePickerPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return CreateWishFormDatePaginationFragment.newInstance(position);
}
@Override
public int getItemPosition(Object object){ //doesnt change much..
return PagerAdapter.POSITION_NONE;
}
@Override
public int getCount() {
return iPageCount;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
registeredFragments.add(position, fragment);
return fragment;
} …
Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我使用视图寻呼机的导航选项卡.我能够使用发布在上面的代码成功绘制标签:
https://github.com/codepath/android_guides/wiki/Sliding-Tabs-with-PagerSlidingTabStrip
在这里,我使用了Sliding选项卡和查看分页器来获取导航选项卡.一切正常,但是当我移动到另一个选项卡时列表没有得到更新.OnResume()被调用,即使对象列表变量也在调试时更新,但可视化列表没有得到更新.
这里我是代码的一些片段:
对于Tab1:在我的情况下是ACTIVE选项卡
@Override
public void onResume() {
super.onResume();
if(!internetUtil.isConnectedToInternet(getActivity())){
mSwipeRefreshLayout.setEnabled(false);
}else{
mSwipeRefreshLayout.setEnabled(true);
new GetUsersFromServerTask().execute(); // Here i am making the network calls
}
}
Run Code Online (Sandbox Code Playgroud)
在Tab2:哪个是存档选项卡
@Override
public void onResume() {
super.onResume();
new GetUsersArchivedFromServerTask().execute(); // Network calls
}
Run Code Online (Sandbox Code Playgroud)
在MainActivity中:
public class MaterialTab extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.material_main_sample);
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setAdapter(new SampleFragmentPagerAdapter(getSupportFragmentManager()));
PagerSlidingTabStrip tabsStrip = (PagerSlidingTabStrip) findViewById(R.id.tabs);
tabsStrip.setViewPager(viewPager);
tabsStrip.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
if(position == 0){ …
Run Code Online (Sandbox Code Playgroud) 不幸的是,没有回答关于如何隐藏Tab的问题android.support.design.widget.TabLayout
.其他问题都是用的TabHost
,我不想改变我的代码.
我想隐藏"三个"标签.
分段:
viewPager = (ViewPager) rootView.findViewById(R.id.search_viewPager);
viewPager.addOnPageChangeListener(viewPagerListener);
viewPager.setAdapter(adapter);
tabLayout = (TabLayout) rootView.findViewById(R.id.search_tabs);
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.setupWithViewPager(viewPager);
Run Code Online (Sandbox Code Playgroud)
布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical">
<android.support.design.widget.TabLayout
android:id="@+id/search_tabs"
style="@style/TabLayoutStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:elevation="1dp" />
<android.support.v4.view.ViewPager
android:id="@+id/search_viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true" />
</LinearLayout>
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
在我的应用程序中,我有一个ViewPager,每个ViewPager都有一个自定义ListView链接到表格中的行.问题是,当我在第一页中滚动ListView然后滚动ViewPager时,第一页的ListView和第二页的ListView未对齐.listView必须对齐,因为在第一个中我有一个带有描述的TextView,然后有4个带有数据的颜色,而在下一个没有描述的ListViews 6颜色中,所以如果它们未对齐,那么它非常复杂.那么如何一次滚动所有listViews?
非常感谢Rahul Parsani ...我终于设法如何做到这一点......如果你有listView在单独的片段中,并且片段的编号是未定义的,这就是答案:
final ArrayList<ListView> lvs = new ArrayList<ListView>();
for (int j = 0; j < adapter.getCount(); j++) {
YourFragment fragJ = (YourFragment) adapter.getItem(j);
final ListView listViewJ = fragJ.lv;
lvs.add(listViewJ);
}
for (int j = 0; j < lvs.size(); j++) {
final int x = j;
lvs.get(j).setOnTouchListener(new OnTouchListener() {
boolean dispatched = false;
@Override
public boolean onTouch(View v, MotionEvent event) {
if (!dispatched) {
dispatched = true;
if (x != 0) {
lvs.get(x - 1).dispatchTouchEvent(event);
};
if …
Run Code Online (Sandbox Code Playgroud) android listview android-listview android-fragments android-viewpager
我有两个fragments
,Fragment A
而且Fragment B
.Fragment A
列出所有产品并Fragment B
显示有关产品及其图像的详细信息.
Fragment A
从Web服务调用Fragment B
和Fragment B
提取数据并设置为ViewPager
使用Adapter
.最初它显示正确的图像,但此后它总是具有相同的图像.
如果我们adapter.notifyDataSetChanged()
从片段B中的任何点击事件中触发,那么它可以完美地工作,但只要片段B可见,我们就必须立即显示
请看代码.
public class ImageAdapter extends FragmentStatePagerAdapter {
private List<String> pImageURL;
public ImageAdapter(FragmentManager fm, List<String> imageURL) {
super(fm);
// TODO Auto-generated constructor stub
pImageURL = imageURL;
Utility.showLog("PagerAdapter URL", pImageURL.toString());
}
@Override
public Fragment getItem(int position) {
// TODO Auto-generated method stub
String imageURL = pImageURL.get(position);
PImageFragment imageFragment = (PImageFragment) PImageFragment.getInstance(); …
Run Code Online (Sandbox Code Playgroud) 我有一个ViewPager
由一个人填充的FragmentPagerAdapter
.我想从第一个适配器换另一个.问题是之前加载的所有页面(在使用第一个适配器时)仍然是旧的.
我查看了源代码FragmentPagerAdapter
并猜测问题是否因为instatiateItem()
实现而发生.使用具有位置和conatiner id的标签,该方法检查Fragment
该位置是否已存在a .如果有Fragment
这个标签,则附上.设置新适配器时,容器ID和位置不会更改,因此它会找到旧Fragment
的适配器.
你知道一种删除所有旧片段的方法吗?
我有一个FragmentActivity,其中包含四个片段布局中显示的片段.这些选项卡用于在我的数据库中添加或删除内容,并按以下顺序显示:艺术家 - 流派 - 专辑 - 歌曲."相册"选项卡包含数据库中所有艺术家和流派的微调器,并且应当在各自的选项卡中添加艺术家或类型时更新这些微调器.这适用于Artist选项卡; 但是,当我在"流派"选项卡中添加或删除某些内容时,除非我将选项卡更改为"艺术家",或者转到单独的"活动"然后返回,否则更改将不会显示在"相册"中.
我不明白的问题是,当我将标签布局更改为艺术家 - 流派 - 歌曲 - 专辑时,一切都运行得很好.看来这些选项卡只在他们查看单独的活动或片段时才更新,然后返回到应该进行更改的选项卡.我也知道用于刷新微调器的sql或方法不是问题,因为我也尝试将布局更改为Genre - Artist - Album - Song.在这种情况下,类型更新会成功反映在相册中,但是艺术家中的那些更新不会,直到我将两个标签移离相册.
很难解释清楚,并且如果需要我可以发布我的代码,但似乎问题与直接在彼此旁边的选项卡之间导航有关.
我还尝试在我的类型片段中扩充添加相册布局,然后在添加或删除类型时更新微调器.
这是AddGenreFragment:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View v = inflater.inflate(R.layout.add_genre_layout, container, false);
addAlbum = inflater.inflate(R.layout.add_album_layout, container, false);
spinGenre = (Spinner) addAlbum.findViewById(R.id.spinGenre);
return v;
}
Run Code Online (Sandbox Code Playgroud)
然后在删除方法中:
// Refresh the spinners in Add Album
ArrayList<String> genreList = dbh.getAllGenres(); // Return all the genres in the database
if (!genreList.isEmpty()) {
// Set …
Run Code Online (Sandbox Code Playgroud) 我已经意识到在Android中使用标签布局时,它总是会加载触摸它的标签,即之前的标签和标签,因此当您翻页时它会被加载.
但是,我从服务器加载了大量的内容和图像,这会导致大量的数据和内存使用,我经常会得到OOM errors
,我正在使用Glide高效地显示图像.
基本上我需要知道3件事:
clear/recycle/delete
在到达新页面以清除内存后如何使用旧选项卡