我的Activity包含a ViewPager和它的自定义Adapter扩展FragmentStatePagerAdapter.ViewPager包含3个片段
用于从ViewPager中删除片段的代码
MainActivity
public void deleteElement(){
final int currentItem = mViewPager.getCurrentItem();
mPagerAdapter.removeItem(currentItem);
mPagerAdapter.notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)
CustomPagerAdapter
private ArrayList<Item> data;
public void removeItem(int index){
data.remove(index);
}
Run Code Online (Sandbox Code Playgroud)
删除中间Fragment(索引1)时:
data我删除正确的item.Fragment3被删除后notifyDataSetChanged,当前Fragment仍然是用户看到的片段,正在加载的数据来自SavedInstance捆绑所以最终的结果是用户仍然看到Fragment他试图删除的相同,这对他来说有点不好意思.
想法?
我有这个问题,我有FragmentActivity一个ViewPager和一个ViewPagerAdapter.
在这个ViewPager中,我有3个Fragments,每个都包含一个TableLayout以编程方式使用a填充的2dArrayList.
单击FragmentActivity布局中的按钮,我过滤了数据,2dArrayList并且基本上需要Fragments使用新数据集重新创建所有3 (onCreateView在所有数据集中运行方法).
所以我onClickListener为这个按钮创建一个:
private class SlicerSelectedOnClickListener implements OnClickListener {
private ODSharedSlicer slicer;
public SlicerSelectedOnClickListener(ODSharedSlicer slicer) {
super();
this.slicer = slicer;
}
public void onClick(View v) {
String slicerValue = ((Button) v).getText().toString();
Log.d(TAG,"Slicer value: "+ slicerValue +" chosen");
application.currentReport.getODSharedSlicers().get(0).getSharedSlicerSelectedMemebers().add(slicerValue);
ViewGroup parent = (ViewGroup) ((Button) v).getParent();
for (int i = 0; i < parent.getChildCount(); i++)
{
if ((parent.getChildAt(i) …Run Code Online (Sandbox Code Playgroud) 我有2个标签名为tab1(home)和tab2(profile)使用TabPageIndicator和FragmentPagerAdapter库.
在tab2中,我有一个名为"登录"的按钮(tab2膨胀abc.xml).
当用户单击"登录"按钮时,应用程序将在新活动中显示登录表单.登录后,活动结束,tab2的内容视图将更改(它显示用户的个人资料,因为它会膨胀xyz.xml).我怎样才能做到这一点?
public class MainActivity extends SherlockFragmentActivity {
private static String[] TAB_NAMES = null;
private Context context = this;
private static FragmentPagerAdapter adapter ;
@Override
protected void onCreate(Bundle savedInstanceState) {
if (TAB_NAMES == null) {
TAB_NAMES = new String[] {
getResources().getString(R.string.tab_home),
getResources().getString(R.string.tab_profile) };
}
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
adapter = new TabsAdapter(
getSupportFragmentManager());
ViewPager pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(adapter);
TabPageIndicator indicator = (TabPageIndicator) findViewById(R.id.indicator);
indicator.setViewPager(pager);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater …Run Code Online (Sandbox Code Playgroud) 我想为我的android-application(平板电脑的上部布局,智能手机的较低布局)实现以下布局,包括在子项目之间滑动的功能:

所以我用Eclipse创建了一个Master/Detail-Flow活动,它运行正常.对于标签我已经看了一下Support-Library Samples(<sdk>/extras/android/support/v4/samples/),其中给出了一个漂亮的例子(FragmentTabsPager.java),它扩展了FragmentActivity类并使用ViewPager了TabHost-Widget.
我的想法是将两个示例组合到一个应用程序中,因此我不想将TabPage用作Activity,而是将其用作Fragment.在智能手机上这很好用,但在平板电脑上它只能工作一次(这意味着第一次启动时,内容正确加载,但是当我点击左侧列表中的另一个项目时,不再加载内容).更确切地说:选项卡已加载并具有正确的标签,但应该显示在选项卡的内容区域中的内容不在那里,尽管您可以在选项卡之间滑动,就像内容在那里一样.
我的问题是:
为了更容易看到,我从头开始创建了一个完全符合这个想法的演示应用程序,可以从https://github.com/apacha/MasterDetail_And_Tabs下载.
Stackoverflow上没有解决问题的相关帖子:ViewPager PagerAdapter没有更新View,
编辑1:我已经了解了http://developer.android.com/reference/android/support/v4/app/FragmentTabHost.html并发现了Android FragmentTabHost - 尚未完全出炉?.有了这些提示,我设法让它几乎运行,但现在我可以选择一个不提供滑动支持的工作版本(如果我将Tabs直接添加到tabHost:
FragmentTabHost mTabHost = new FragmentTabHost();
// Add directly to tab-host
mTabHost.addTab(mTabHost.newTabSpec("simple1").setIndicator("Simple1"), CountingFragment.class, b);
Run Code Online (Sandbox Code Playgroud)
如果我添加它并使用FragmentPagerAdapter,则可以使用错误的滑动实现
FragmentTabHost mTabHost = new FragmentTabHost();
ViewPager mViewPager = (ViewPager) rootView.findViewById(R.id.pager);
TabsAdapter mTabsAdapter = new TabsAdapter(getActivity(), mTabHost, mViewPager);
// Add to tab-host-adapter
mTabsAdapter.addTab(mTabHost.newTabSpec("simple1").setIndicator("Simple1"), CountingFragment.class, b);
Run Code Online (Sandbox Code Playgroud)
我已经将所有更改提交到上面提到的存储库.
我有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.
我试图使用静态类将值传递给视图而不是使用intent,因为我必须传递大量数据.有时我会收到此错误,但无法找出主要原因
错误: -
java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 101, found: 200
我的传呼班
public class MemeDetailActivity extends AppCompatActivity implements OnDialogClickListner<Void> {
private ViewPager mPager;
private List<Datum> mList;
private ScreenSlidePagerAdapter pagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_meme_detail);
mList = DataResult.getInstance().getData();
DataResult.getInstance().resetData();
if (mList != null)
startPager(selected_position);
else
Toast.makeText(this, "Error loading data", Toast.LENGTH_SHORT).show();
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
client …Run Code Online (Sandbox Code Playgroud) 我从一个被解析为Application类中对象的Web服务接收数据,在我的例子中,这个对象Report包含一个Tabs应该填充的列表ViewPager.因此,此报告存储在currentReportApplication类的参数中.
每个标签应该是一个页面ViewPager.因此,当我第一次收到数据并解析数据时,所有数据都能完美运行,并且View Pager会填充正确的数据并显示出来.
当我想Report从服务器获取新内容并ViewPager使用已解析为currentReport参数的新数据刷新时,我的问题就出现了.
我ViewPager可以刷卡并且有标签导航,因此当我尝试ViewPager使用新的重新实例化时,Report我看到添加了适量的标签tabHost.由于某种原因,新报告的片段覆盖了普通报告的片段.因此,如果新报告中的选项卡数量大于上一个报告中的选项卡,那么我可以看到上一个报告中的选项卡以及部分新选项卡(例如,在第一个报告中我有一个选项卡,以及在新的我有3然后我看到前一个片段和下一个片段中的最后一个片段).
我从本教程开始我的开发并添加了smoe代码:http://thepseudocoder.wordpress.com/2011/10/13/android-tabs-viewpager-swipe-able-tabs-ftw/
这是我的Tab活动代码:
public class TabsViewPagerFragmentActivity extends FragmentActivity implements ViewPager.OnPageChangeListener, TabHost.OnTabChangeListener
{
static final String TAG = TabsViewPagerFragmentActivity.class.getSimpleName();
private TabHost mTabHost;
private ViewPager mViewPager;
private HashMap<String, TabInfo> mapTabInfo;
public ViewPagerAdapter mPagerAdapter;
private TextView tvReportName, tvTabTitle;
private Button bBackToParameters;
private Dialog progressDialog;
private SGRaportManagerAppObj application;
private int numberOfTabs = …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) 似乎之前讨论过刷新问题,但没有一个解决方案适合我.
我想做的是: 我正在使用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
请告诉我如何在android上重置ViewPager的内容.我试图调用adapter.notifyDataSetChanged()但是当我滚动视图时,适配器不会调用getItem(position).它总是返回旧的子视图.
更新:这是我的片段视图.当我重置viewPager数据时,它使用了加载的Fragment视图.它只是从onCreateView而不是Constructor开始.
public class ResultView extends Fragment {
//Declare properties
//Constructor
public ResultView(Province province, Calendar calendar) {
Log.d("xskt", "ResultView constructor");
this.province = province;
this.calendar = (Calendar) calendar.clone();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
Log.d("xskt", "ResultView onCreateView");
View view = inflater.inflate(R.layout.resultview, null);
//do some thing
return view;
}
Run Code Online (Sandbox Code Playgroud)
谢谢.