在我的应用程序中,我使用了ViewPager。 像,
(say main.xml)
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@+id/register_header" />
在FragmentActivity中创建ViewPager对象和ViewPagerAdapter(扩展FragmentPagerAdapter)对象。
_mViewPager = (ViewPager) findViewById(R.id.viewPager);
_adapter = new ViewPagerAdapter(getApplicationContext(),
getSupportFragmentManager());
_mViewPager.setAdapter(_adapter);
Adapter类就像,
public class ViewPagerAdapter extends FragmentPagerAdapter {
private Context _context;
private FragmentManager manager;
private Fragment f;
private String classname="ViewPagerAdapter";
public ViewPagerAdapter(Context context, FragmentManager fm) {
super(fm);
_context=context;
manager=fm;
}
@Override
public Fragment getItem(int position) {
Log.i(classname,"getItem called"+position);
f = new Fragment();
f=MyFragment.newInstance();
Bundle args = new Bundle();
args.putInt("position", position);
f.setArguments(args);
return f;
}
@Override
public int getCount() {
return User.getPageCount();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
}
在MyFragment Class中,
在onResume中,我必须将wigets对象存储到公共静态变量。
public void onResume() {
super.onResume();
pageIndex = getArguments().getInt("position");
User.useTextview1=textview1;
User.useTextview2= textview2;
User.current_pageIndex=pageIndex;
}
我必须更新从FragmentActivity中的User类获取的textviews。 我的问题是第一次调用getItem()方法两次 事实上,模拟器中显示的视图是第0个索引,但在FragmentActivity中获得了第一个索引值。 如果我第二次停止调用getItem()方法,我可以在FragmentActivity中获得第0个索引TextView引用。
请为我提供最好的方法。
由于
答案 0 :(得分:17)
FragmentPagerAdapter
在开始时为索引0和索引1实例化Fragments
。如果要从屏幕上的Fragment
获取数据,可以使用{ {1}} setOnPageChangeListener
获取当前排名。然后将Pager
与SparseArray
放在您的片段中。在WeakReference
调用中更新该数组。调用getItem
后,请使用该排名来引用右onPageSelected
和更新Fragment
数据。
数组的初始化:
User
答案 1 :(得分:1)
我的问题是第一次调用getItem()方法两次
这不是问题,这是default feature of FragmentPagerAdapter
。它有助于您从此页面滑动到下一个页面和之前的页面。
模拟器中显示的视图是第0个索引,但在FragmentActivity中获得第一个索引值
我遇到了同样的问题,我知道为什么。这是因为您used same Fragment in View Pager
。
如何解决这个问题是separate Fragments by using different Fragment
。
答案 2 :(得分:1)
在getItem方法中我写了这个..
@Override
public Fragment getItem(int index) {
EditFragment frag = new EditFragment();
Bundle args = new Bundle();
args.putSerializable("currentItem", itemsList.get(index));
frag.setArguments(args);
return (frag);
}
这里的itemsList.get(index)是我将在EditFragment类中使用的模型类对象。 就是这样。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View result = inflater.inflate(R.layout.pager_fragment_layout, container, false);
image = (ImageView)result.findViewById(R.id.pager_image);
text = (TextView)result.findViewById(R.id.pager_item_desc);
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getActivity()).build();
ImageLoader.getInstance().init(config);
imLoader = ImageLoader.getInstance();
****NOTE
final SwapItems itemList = (SwapItems) getArguments().getSerializable("currentItem");
imagePath = itemList.getPaths().get(0);
imLoader.displayImage(imagePath,image);
text.setText(itemList.getItemDescription());
image.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Fragment fragment = new ItemImagesFragment();
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Bundle bundle = new Bundle();
bundle.putSerializable("val", itemList);
fragment.setArguments(bundle);
fragmentTransaction.replace(R.id.content_frame, fragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
});
return result;
}
注意:这里我从前面的getItem方法得到的swapitems模型对象是'final'。这解决了我的问题。之前我使用static as modifier初始化了相同的对象。
希望你的也明白
答案 3 :(得分:0)
您可以使用此方法更新您的观看次数
<?php
class makelist{
public $list;
}
class ListGenerator {
public $makelist = [];
public function setlist($list){
$this->makelist = $list;
}
public function getHTML(){
$result = '<select name="category">';
foreach ($this->makelist as $list) {
$result = $result . '<option>' . $list . '</option>';
}
$result =$result . '</select>';
return $result;
}
}
?>
答案 4 :(得分:0)
我面临同样的问题 - 两次调用getItem()方法。我不知道您使用该方法的目的是在新幻灯片出现时触发托管活动的更改。
嗯,首先getItem()不是一个正确的方法来获取出现新幻灯片的事件。
为此,我在ViewPager上使用了ViewPager.OnPageChangeListener监听器。 这是我做的:
在包含幻灯片段的活动中:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.signature_wizard_activity);
// Instantiate a ViewPager and a PagerAdapter.
mPager = (ViewPager) findViewById(R.id.pager);
mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
mPager.setAdapter(mPagerAdapter);
mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
onSlideChanged(position); // change color of the dots
}
@Override
public void onPageSelected(int position) {}
@Override
public void onPageScrollStateChanged(int state) {}
});
}
每次幻灯片出现时都会调用onPageScrolled(),作为参数,它会显示所显示幻灯片的当前位置。好的一点就是它被调用,包括它第一次出现,而不仅仅是当幻灯片被更改时。
什么时候可以使用? 例如,如果您在ViewPager中有一些向导活动,其中您使用一些提示滑动片段,您可能希望在滑块下方有一个灰色圆点的条形图,它将代表幻灯片的总数,其中一个圆点将是不同的代表当前幻灯片的颜色。 在这种情况下,ViewPager.OnPageChangeListener和方法onPageScrolled()将是最佳选择。
或者如果你有PREV按钮。和NEXT更改幻灯片,你想禁用PREV。第一张幻灯片上的按钮,并禁用最后一张幻灯片上的NEXT按钮。以下是在onPageScrolled()方法中执行此操作的方法:
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if(position == 0){
prevBtn.setTextColor(ContextCompat.getColor(SignatureWizardActivity.this, R.color.main_grey_500));
prevBtn.setEnabled(false);
}else{
prevBtn.setTextColor(ContextCompat.getColor(SignatureWizardActivity.this, R.color.main_blue));
prevBtn.setEnabled(true);
}
if(position == NUM_PAGES -1){
nextBtn.setTextColor(ContextCompat.getColor(SignatureWizardActivity.this, R.color.main_grey_500));
nextBtn.setEnabled(false);
}else{
nextBtn.setTextColor(ContextCompat.getColor(SignatureWizardActivity.this, R.color.main_blue));
nextBtn.setEnabled(true);
}
}
其中NUM_PAGES是一个常数,幻灯片总数