首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FragmentPagerAdapter到ViewPager

FragmentPagerAdapter到ViewPager
EN

Stack Overflow用户
提问于 2017-08-12 18:56:56
回答 1查看 697关注 0票数 1

不久前,我开始使用Android并学习Java,现在我开始使用适配器来区分ViewPager。我自己没有足够的知识来解决这些部件的行为问题,我会感谢您的帮助。(对不起我的英语)

的想法是:

( 1)一列记录(如Instagram),可以向上向下滚动;

( 2)每个记录都有图像块和文本块,图像块可以左右滚动;

是如何组织的(也见截图):

( 1) (main.xml)在主布局(ConstraintLayout)上有nestedScrollView,其中包括LinearLayout (records.xml)。这是记录栏。

2) LinearLayout中充满了循环记录(record.xml)。每个记录都是ConstraintLayout,其中包含ViewPager和TextView。

3)在每条新添加的记录中,我都试图找到ViewPager,我将适配器设置为setAdapter(新的setAdapter)

4) MyFragmentPagerAdapter在getItem调用RecordImageFragment.newInstance时,创建新的片段(RecordImageFragment.java)。

5)每个RecordImageFragment放置FrameLayout (record_images_pager.xml),在其中找到ImageView,并在其中放置图片。

截图:

应用程序运行

项目结构

问题是:

所有的作品,但图片只能在第一次记录。在创建记录时,我还会在那里找到TextView (record.xml)并将文本设置为它。文本不同记录(这很好),但只有第一次ViewPager在第一记录有图片。虽然适配器(MyFragmentPagerAdapter)在每个ViewPager、OnPageChangeListener调用中都能工作,但是跟踪位置: 0-2。经过研究发现,RecordImageFragment认为第一条记录是他的ViewGroup.getRootView().getRootView() (而不是适配器设置到的记录)。到目前为止,我一直试图弄清楚,为什么片段(RecordImageFragment.java)的内容(RecordImageFragment.java)不是添加到ViewPager中,而是添加到第一个适配器中。

MainActivity.java

代码语言:javascript
复制
package example;

import android.os.*;
import android.support.v4.app.*;
import android.support.v4.view.*;
import android.support.v7.app.AppCompatActivity;
import android.util.*;
import android.view.*;
import android.widget.*;

public class MainActivity extends AppCompatActivity {
	@Override
    protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		addRecords();
	}
	
	public void addRecords()
	{
		for (int j = 1; j <= 10; j++  ) 
		{
			addNewRecord(j);
		}
	}
	public void addNewRecord(int id)
	{
		LinearLayout records = (LinearLayout) findViewById(R.id.records);
		// Add new record
		LayoutInflater inflater = getLayoutInflater();
		View record = inflater.inflate(R.layout.record, null, false);
		records.addView(record);
		// Set text to text field
		TextView title_tv = (TextView) record.findViewById(R.id.title);
		title_tv.setText("Запись " + id);
		//Find ViewPager, add adapter and page change listener
		ViewPager pager = (ViewPager) record.findViewById(R.id.pager);
		pager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager()));
		pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener()
		{
			@Override
			public void onPageSelected(int position) { Log.d("example", "Картинка сменилась на: " + position);}
			@Override
			public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
			@Override
			public void onPageScrollStateChanged(int state) {}
		});
	}
	
	private class MyFragmentPagerAdapter extends FragmentPagerAdapter
	{
		int[] internalPicts = {R.drawable.pict1, R.drawable.pict2, R.drawable.pict3};
		public MyFragmentPagerAdapter(FragmentManager fm) { super(fm); }
		@Override
		public Fragment getItem(int pos) { return RecordImageFragment.newInstance(internalPicts[pos]); }
		@Override
		public int getCount() {
			return internalPicts.length;
		}
	}
}

RecordImageFragment.java

代码语言:javascript
复制
package example;

import android.os.Bundle;
import android.support.v4.content.*;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

public class RecordImageFragment extends android.support.v4.app.Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View layoutWithImage = inflater.inflate(R.layout.record_images_pager, container, false);
		//Find ImageView on layout and place drawable there
		ImageView image = (ImageView) layoutWithImage.findViewById(R.id.image);
		int imgId = getArguments().getInt("img");
		image.setImageDrawable(ContextCompat.getDrawable(getActivity(), imgId));
    	return layoutWithImage;
    }

    public static RecordImageFragment newInstance(int image) {
		RecordImageFragment f = new RecordImageFragment();
        Bundle b = new Bundle();
        b.putInt("img", image);
		f.setArguments(b);
        return f;
    }
}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-12 21:38:29

最后,经过几个小时的搜寻和尝试。我找到答案了。这个问题很微妙。问题在于适配器,您正在使用适配器中的FragmentManager来管理片段。在随后的(第二行或第三行)中,我认为FragmentPagerAdapter并不认为getItem()方法返回的项是新的片段。所以你根本没看到他们。这可能是因为您使用相同的FragmentManager来管理适配器。

解决方案是通过使用基本的FragmentManager并自己实现instantiateItem()destroyItem()来彻底消除instantiateItem()。这就消除了对片段的需求,您可以自己来膨胀图像视图。

这是您需要设置的新MyPagerAdapter,而不是MyFragmentPagerAdapter

代码语言:javascript
复制
private class MyPagerAdapter extends PagerAdapter {
        int[] internalPicts = {R.drawable.dashboard, R.drawable.icon, R.drawable.mockup};

        public MyPagerAdapter() {
            super();
        }

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

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        @Override
        public Object instantiateItem(ViewGroup collection, int position) {

            // Inflating layout
            LayoutInflater inflater = (LayoutInflater) collection.getContext()
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            View view = inflater.inflate(R.layout.record_images_pager, null);

            ImageView image = (ImageView) view.findViewById(R.id.image);

            image.setImageDrawable(ContextCompat.getDrawable(getApplicationContext(), internalPicts[position]));

            collection.addView(view, 0);
            return view;

        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }
    }

最后,请确保用pager.setAdapter(new MyFragmentPagerAdapter());替换pager.setAdapter(new MyPagerAdapter());

你也不需要RecordImageFragment

在Android中测试。

我读了作为参考。

提示-使用ListView与一个自定义适配器,而不是一个简单的LinearLayout放置您的所有视图页,以顺利滚动。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45653842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档