0

viewpager을 3 fragments A, B, C로 채 웁니다. 각각 선형 레이아웃 관리자가있는 recycler view입니다. viewpagerAsyncTask을 사용하여 일부 데이터를 가져온 후 활동에 설정됩니다.안드로이드 ViewPager는 첫 번째 조각 onload에 대한 빈 화면을 보여 주지만 다른 조각을 가로 지르는 경우 올바른 내용을 표시합니다.

활동보기로드에서 첫 번째 fragment (A)은 빈 화면 (내용 없음)을 표시합니다. 그러나 A에서 B, B에서 C, 그리고 C에서 B, B에서 A로 조각을 스 와이프하면 fragment A에 예상되는 내용을 볼 수 있습니다.

파편 A (오디오) -로드에 다음 B (비디오), 및 C (텍스트)

Frag A-1Frag BFrag-C

역방향 : C -> B -> A (본 시간 함량은

Frag-CFrag BFrag-A-2

)가 나타납니다 3,691,363,210

fragment_audio_items.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/audio_feed_item_list_recycler_view" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

    </android.support.v7.widget.RecyclerView> 

</LinearLayout> 

AudioFeedItemsFragment.java

package com.abc.app.fragments; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import com.abc.app.R; 
import com.abc.app.adapters.FeedItemListRVAdapter; 
import com.abc.app.models.feed.FeedItem; 


import java.util.ArrayList; 
import java.util.List; 

/** 
* Created by amit on 10/12/16. 
*/ 

public class AudioFeedItemsFragment extends Fragment { 

    public static final String AUDIO_FEED_ITEM_LIST = "AUDIO_FEED_ITEM_LIST"; 

    RecyclerView mRecyclerView; 
    LinearLayoutManager mLinearLayoutManager; 
    FeedItemListRVAdapter mFeedItemListRVAdapter; 
    List<FeedItem> mAudioFeedItemList = new ArrayList<>(); 
    Bundle mBundle; 

    public static AudioFeedItemsFragment newInstance(ArrayList<FeedItem> feedItems) { 
     AudioFeedItemsFragment audioFeedItemsFragment = new AudioFeedItemsFragment(); 
     Bundle audioArgs = new Bundle(); 
     audioArgs.putParcelableArrayList(AUDIO_FEED_ITEM_LIST, feedItems); 
     audioFeedItemsFragment.setArguments(audioArgs); 
     return audioFeedItemsFragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mBundle = getArguments(); 
     if (null != mBundle) { 
      mAudioFeedItemList = mBundle.getParcelableArrayList(AUDIO_FEED_ITEM_LIST); 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_audio_items, container, false); 
     mRecyclerView = (RecyclerView) rootView.findViewById(R.id.audio_feed_item_list_recycler_view); 
     mLinearLayoutManager = new LinearLayoutManager(getContext()); 
     mRecyclerView.setLayoutManager(mLinearLayoutManager); 

     mFeedItemListRVAdapter = new FeedItemListRVAdapter(mAudioFeedItemList); 
     mRecyclerView.setAdapter(mFeedItemListRVAdapter); 


     return rootView; 
     ///return super.onCreateView(inflater, container, savedInstanceState); 
    } 

} 
단편 B 및 C에 대한 유사 코드

FeedMediaTabCollectionAdapter.java

012,383,795 527,

activity_new_feed_items.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/feed_media_layout" 
    android:layout_width="match_parent" android:layout_height="match_parent"> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/feed_media_pager" 
     android:layout_width="match_parent" android:layout_height="match_parent"> 

     <android.support.design.widget.TabLayout 
      android:id="@+id/feed_media_tab_layout" 
      app:tabMode="scrollable" 
      app:tabGravity="fill" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

     </android.support.design.widget.TabLayout> 

    </android.support.v4.view.ViewPager>- 


</android.support.design.widget.CoordinatorLayout> 

NewFeedItemsActivity.java

package com.abc.app.activities; 

import android.app.ProgressDialog; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.design.widget.TabLayout; 
import android.support.v4.view.ViewPager; 

import com.abc.app.R; 
import com.abc.app.adapters.FeedMediaTabCollectionAdapter; 
import com.abc.app.fragments.AudioFeedItemsFragment; 
import com.abc.app.fragments.TextFeedItemsFragment; 
import com.abc.app.fragments.VideoFeedItemsFragment; 
import com.abc.app.models.feed.FeedItem; 
import com.abc.app.models.feed.FeedLink; 
import com.abc.app.utilities.FeedUtils; 

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

/** 
* Created by amit on 13/12/16. 
*/ 

public class NewFeedItemsActivity extends DrawerActivity { 

    public static final String AUDIO = "Audio"; 
    public static final String VIDEO = "Video"; 
    public static final String TEXT = "Text/Misc"; 
    private ArrayList<FeedItem> mAudioFeedItemList = null; 
    private ArrayList<FeedItem> mVideoFeedItemList = null; 
    private ArrayList<FeedItem> mTextFeedItemList = null; 
    private Map<String, ArrayList<FeedItem>> feedItemsListMap = null; 
    static ArrayList<FeedLink> mfeedLinks; 
    ProgressDialog mProgressDialog; 


    FeedMediaTabCollectionAdapter mFeedMediaTabCollectionAdapter; 
    ViewPager mViewPager; 
    TabLayout mTabLayout; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentLayout(R.layout.activity_new_feed_items); 

     mViewPager = (ViewPager) findViewById(R.id.feed_media_pager); 
     mTabLayout = (TabLayout) findViewById(R.id.feed_media_tab_layout); 

     new LoadFeedItemList().execute(); 

    } 

    public void setupViewPager() { 
     List<String> titles = Arrays.asList(AUDIO, VIDEO, TEXT); 
     mFeedMediaTabCollectionAdapter = new FeedMediaTabCollectionAdapter(getSupportFragmentManager(), feedItemsListMap, titles); 
     mViewPager.setAdapter(mFeedMediaTabCollectionAdapter); 
     mTabLayout.setupWithViewPager(mViewPager); 
    } 

    class LoadFeedItemList extends AsyncTask<String, String, String> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      mProgressDialog = new ProgressDialog(NewFeedItemsActivity.this); 
      mProgressDialog.setMessage("Loading feed items..."); 
      mProgressDialog.setIndeterminate(false); 
      mProgressDialog.setCancelable(false); 
      mProgressDialog.show(); 
      mAudioFeedItemList = new ArrayList<>(); 
      mVideoFeedItemList = new ArrayList<>(); 
      mTextFeedItemList = new ArrayList<>(); 
      feedItemsListMap = new HashMap<>(); 

      populateFeedLinks(); 
     } 

     @Override 
     protected String doInBackground(String... params) { 
      List<FeedItem> feedItemList = new ArrayList<>(); 
      for (FeedLink feedLink : mfeedLinks) { 
       List<FeedItem> localFeedItems = FeedUtils.getFeedItemList(feedLink.getUrl(), feedLink.getType()); 
       for (FeedItem feedItem : localFeedItems) { 
        String mimeType = FeedUtils.getFeedItemMediaType(feedItem); 
        if (mimeType.equalsIgnoreCase(FeedUtils.AUDIO)) { 
         mAudioFeedItemList.add(feedItem); 
        } else if (mimeType.equalsIgnoreCase(FeedUtils.VIDEO)) { 
         mVideoFeedItemList.add(feedItem); 
        } else { 
         mTextFeedItemList.add(feedItem); 
        } 
       } 
      } 


      return null; 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
      feedItemsListMap.put(AudioFeedItemsFragment.AUDIO_FEED_ITEM_LIST, mAudioFeedItemList); 
      feedItemsListMap.put(VideoFeedItemsFragment.VIDEO_FEED_ITEM_LIST, mVideoFeedItemList); 
      feedItemsListMap.put(TextFeedItemsFragment.TEXT_FEED_ITEM_LIST, mTextFeedItemList); 
      setupViewPager(); 
      mProgressDialog.dismiss(); 

     } 
    } 

    void populateFeedLinks() { 

     mfeedLinks = new ArrayList<>(); 
     FeedLink feedLink1 = new FeedLink(); 
     feedLink1.setUrl("http://www.bbc.co.uk/programmes/p002vsnk/episodes/downloads.rss"); 
     feedLink1.setType(FeedUtils.RSS); 
     mfeedLinks.add(feedLink1); 

     /*FeedLink feedLink2 = new FeedLink(); 
     feedLink2.setUrl("http://www.npr.org/rss/podcast.php?id=344098539"); 
     feedLink2.setType(FeedUtils.RSS); 
     mfeedLinks.add(feedLink2);*/ 

     FeedLink feedLink3 = new FeedLink(); 
     feedLink3.setUrl("http://www.theregister.co.uk/headlines.atom"); 
     feedLink3.setType(FeedUtils.ATOM); 
     mfeedLinks.add(feedLink3); 

     /* 
     FeedLink feedLink4 = new FeedLink(); 
     feedLink4.setUrl("http://www.lse.ac.uk/assets/richmedia/webFeeds/publicLecturesAndEvents_AtomAllMediaTypes2016.xml"); 
     feedLink4.setType(FeedUtils.ATOM); 
     mfeedLinks.add(feedLink4);*/ 
    } 
} 

업데이트 : 내가 생각, 나는 코드로 문제를 발견했다. 문제는 FeedItemListRVAdapter.java에서 FeedItemListRVAdapter.java

FeedItemListRVAdapter.java

public class FeedItemListRVAdapter extends RecyclerView.Adapter<FeedItemListRVAdapter.FeedItemViewHolder> { 

    private static String TAG = "FeedItemListRVAdapter"; 

    public static List<FeedItem> feedItemList; // <------- static?? This was the issue! 

    @Override 
    public FeedItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     Log.d(TAG, "-----------onCreateViewHolder--------------"); 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.feed_item_list, parent, false); 
     FeedItemViewHolder feedItemViewHolder = new FeedItemViewHolder(view); 
     return feedItemViewHolder; 
    } 

    @Override 
    public void onBindViewHolder(FeedItemViewHolder holder, int position) { 
     Log.d(TAG, "-----------onBindViewHolder--------------"); 
     holder.feedItemTitle.setText(feedItemList.get(position).getTitle()); 
     holder.feedItemDescription.setText(feedItemList.get(position).getDescription()); 
     holder.feedItemPubDate.setText(FeedUtils.getLocalTimeString(feedItemList.get(position).getPubDate())); 
     String downloadSize = FeedUtils.round2DecimalPlace(FeedUtils.bytesToMB(feedItemList.get(position).getMediaFileSize())); 
     holder.feedItemDownloadSize.setText(downloadSize + " MB"); 
     holder.feedItemDuration.setText(FeedUtils.getMinSec(feedItemList.get(position).getMediaDuration()) + " min"); 
    } 

    @Override 
    public int getItemCount() { 
     return feedItemList.size(); 
    } 

    public static class FeedItemViewHolder extends RecyclerView.ViewHolder { 

     CardView cardView; 
     TextView feedItemTitle; 
     TextView feedItemPubDate; 
     TextView feedItemDuration; 
     TextView feedItemDownloadSize; 
     TextView feedItemDescription; 


     FeedItemViewHolder(View itemView) { 
      super(itemView); 
      Log.d("FeedItemViewHolder", "-----------FeedItemViewHolder--------------"); 
      cardView = (CardView) itemView.findViewById(R.id.feed_item_card_view); 
      feedItemTitle = (TextView) itemView.findViewById(R.id.feed_item_title); 
      feedItemPubDate = (TextView) itemView.findViewById(R.id.feed_item_pub_date); 
      feedItemDuration = (TextView) itemView.findViewById(R.id.feed_item_duration); 
      feedItemDownloadSize = (TextView) itemView.findViewById(R.id.feed_item_download_size); 
      feedItemDescription = (TextView) itemView.findViewById(R.id.feed_item_description); 
     } 
    } 

    public FeedItemListRVAdapter(List<FeedItem> feedItemList) { 

     this.feedItemList = feedItemList; 
    } 
} 

답변

1

, 정적 멤버 feedItemList이 때 FeedItemListRVAdapter 빈 데이터로 덮어 쓰기하는 문제였다 파일에 있었다 생성자가 두 번째 조각으로 호출되었습니다. 그것이 비 정적으로 바뀌었고 효과가있었습니다.