1

我已經開始使用Android Studio和不久前學習Java,現在在適配器適用於differen ViewPager時已經停滯不前。我自己沒有足夠的知識來解決這些組件的行爲問題,並會很感激您的幫助。 (對不起,我的英語FragmentPagerAdapter到ViewPager

的理念是:

1)記錄的列(如在Instagram的),它可以滾動上下;

2)每條記錄都有圖像塊,可以左右滾動,文本塊;

它是如何組織的(見截圖也):

1)(main.xml中)在主佈局(ConstraintLayout)有nestedScrollView,其中包括我的LinearLayout(records.xml)。這是記錄列。

2)LinearLayout被循環中的記錄填充(record.xml)。每條記錄都是ConstraintLayout,其中包含ViewPager和TextView。

3)在每個新添加的記錄中,我試圖找到ViewPager,我使用setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager()))將適配器設置爲它。

4)MyFragmentPagerAdapter當來到getItem時調用RecordImageFragment.newInstance,創建新的片段(RecordImageFragment.java)。

5)每個RecordImageFragment放置FrameLayout(record_images_pager.xml),在其中找到ImageView,並在其中放置圖片。

截圖:

app running

project structure

的問題是:

所有的作品,但圖片僅見於第一條記錄。 創建記錄時,我還在其中找到TextView(record.xml)併爲其設置文本。文本與要記錄的記錄不同(這很好),但只有第一個記錄中的第一個ViewPager有圖片。儘管適配器(MyFragmentPagerAdapter)適用於每個ViewPager,但OnPageChangeListener調用追蹤位置:0-2。經過研究發現,RecordImageFragment認爲第一條記錄是他的ViewGroup.getRootView()。getRootView()(不是適配器設置的記錄)。直到現在我試圖弄清楚爲什麼片段(RecordImageFragment.java)的內容(record_images_pager.xml)不是添加到ViewPager中,而是添加到適配器設置的ViewPager中,而是添加到第一個。

MainActivity.java

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

RecordImageFragment。java的

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); 
 
\t \t //Find ImageView on layout and place drawable there 
 
\t \t ImageView image = (ImageView) layoutWithImage.findViewById(R.id.image); 
 
\t \t int imgId = getArguments().getInt("img"); 
 
\t \t image.setImageDrawable(ContextCompat.getDrawable(getActivity(), imgId)); 
 
    \t return layoutWithImage; 
 
    } 
 

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

回答

1

最後,搜索和嘗試的小時後。我找到了答案。這個問題非常微妙。問題在於您的適配器,您在適配器中使用FragmentManager來管理這些碎片。在隨後的(第二或第三行)中,我認爲FragmentPagerAdapter不會將getItem()方法返回的項目視爲新片段。所以你根本看不到它們。這可能是因爲您使用相同的FragmentManager來管理適配器。

解決方案將通過使用基本的PagerAdapter和自己實現instantiateItem()destroyItem()完全廢除FragmentManager。這消除了碎片開始的需要,您可以簡單地自行膨脹圖像視圖。

這裏是新的MyPagerAdapter你需要代替MyFragmentPagerAdapter

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 Studio中測試。

我讀this作爲參考。

提示 - 使用ListView與自定義適配器,而不是簡單的LinearLayout放置您的所有視圖頁以平滑滾動。

相關問題