2016-12-21 11 views
0

내 활동으로 인해 뷰 페이지 및 프래그먼트가 만들어 지지만 처음 입력 할 때 데이터가없는 경우 페이저를 1에서 4로 스크롤 한 다음 양식을 4에서 2로 스크롤하면이 순간 데이터가 표시되고 스크롤을 계속합니다 , 모든 데이터가 표시됩니다. 왜 그런지 모르겠지만, 도와 주실 수 있습니까?처음으로 내 활동을 입력 할 때 왜 viewpager + 프래그먼트를 만들지 못했습니까?

public class WatchVideosActivity extends FragmentActivity { 

private TabPageIndicator mTabIndicator; 
private ViewPager mViewPager; 
private int mWidth; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_watch_videos); 

    getScreenWidth(); 
    initView(); 
} 

/** 
* 获取屏幕的宽度 
*/ 
private void getScreenWidth(){ 
    DisplayMetrics dm = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(dm); 
    mWidth = dm.widthPixels; 
} 

/** 
* 初始化View 
*/ 
private void initView(){ 
    mTabIndicator = (TabPageIndicator)findViewById(R.id.tab_pager_indicator); 
    mViewPager = (ViewPager)findViewById(R.id.watch_video_viewpager); 
    mViewPager.setAdapter(new WatchVideoPagerAdapter(WatchVideosActivity.this,getSupportFragmentManager(),mWidth)); 
    mTabIndicator.setViewPager(mViewPager); 
} 

}

public class WatchVideoPagerAdapter extends FragmentPagerAdapter{ 

public static final String[] title = new String[]{"期指在线","和讯座谈会","中国经济学人","中国分析师访谈"}; 
private Context mContext; 
private int mWidth; 

public WatchVideoPagerAdapter(Context context,FragmentManager fm,int width) { 
    super(fm); 
    this.mContext = context; 
    this.mWidth = width; 
} 

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

@Override 
public Fragment getItem(int position) { 
    return new FragmentFactory(mContext,position,mWidth); //创建fragment 
} 

@Override 
public CharSequence getPageTitle(int position) { 
    return title[position]; 
} 

}

public class FragmentFactory extends Fragment { 

private int position; 
private ListView mWatchVideoList; 
private Context mContext; 
private int mWidth; 
private Integer mPagerIndex = 1; 
private Integer[] titleId = new Integer[] { 123817825, 180524655, 168567237, 1820}; 
private List<VideoEntity> newsPagerList = new ArrayList<VideoEntity>(); 
private VideoAdapter videoAdapter; 

public FragmentFactory(Context context, int position, int width) { 
    super(); 
    this.position = position; 
    this.mContext = context; 
    this.mWidth = width; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.watchvideo_fragment_view, container, false); 
    mWatchVideoList = (ListView) view.findViewById(R.id.watchvideo_list); 
    getData(); 
    mWatchVideoList.setAdapter(videoAdapter); 
    return view; 
} 

private Handler mHandler = new Handler() { 
    @SuppressWarnings("unchecked") 
    public void handleMessage(android.os.Message msg) { 
     newsPagerList = (List<VideoEntity>) msg.obj; 
     videoAdapter = new VideoAdapter(mContext, mWatchVideoList, newsPagerList, mWidth); 
     videoAdapter.notifyDataSetChanged(); 
    }; 
}; 

private void getData() { 
    OkHttpUtils.getInputStream("http://wapi.hexun.com/Api_videoList.cc?pid=" + titleId[position] + "&pc=20&pn=1", 
      mHandler, 0); 
} 

}

enter image description here

+0

당신은 데이터를 가져 오는 데 시간이 걸릴 것입니다 네트워크에 전화를 걸고 있습니다 –

+0

난 그렇게 생각하지 않아, 내가 입력하고 당신이 스크롤하지 않는 viewpager, 잠시 기다려, 그것은 항상 데이터가 없습니다 –

답변

1

대신에 당신이에서 데이터를 가져 오는 경우

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
View view = inflater.inflate(R.layout.watchvideo_fragment_view, container, false); 
mWatchVideoList = (ListView) view.findViewById(R.id.watchvideo_list); 
newsPagerList=new ArrayList<VideoEntity>(); 
videoAdapter = new VideoAdapter(mContext, mWatchVideoList, newsPagerList, mWidth); ///Send empty list for the first time 
mWatchVideoList.setAdapter(videoAdapter); 
getData(); 
return view; 

}

이 VideoAdapter

내부
VideoAdapter{ 


public void addItems(ArrayList<VideoEntity> list){ 
newsPageList.addAll(list); ///newsPageList is your list used in Adapter 
notifyDataSetChanged(); 
} 

을하는 방법을 확인 onCreteView에 1 회 인스턴스화) handleMessage (내부 VideoAdapter를 인스턴스화하지 마십시오 그런 다음 서버가 어댑터의 addItems() 메소드를 호출하여 목록을 알리면 데이터가 표시됩니다.

private Handler mHandler = new Handler() { 
@SuppressWarnings("unchecked") 
public void handleMessage(android.os.Message msg) { 
    newsPagerList = (List<VideoEntity>) msg.obj; 
    videoAdapter.addItems(newsPagerList); 
}; 

}};

희망이 도움이 될 것입니다.

+0

대단히 감사합니다, 당신 말이 맞아요. –

0

목록의 어댑터가 mHandler에서 동일하지 않습니다 : 다음은 내 코드입니다.

+0

몇 가지 설명을 추가 이 대답을 통해 현재의 문제를 해결하는 방법에 대한 답변이 –

+0

내 목록 어댑터가 동일합니다 –

+0

새로운 mHandler 어댑터가 있습니다. onCreateView()와 동일하지 않습니다. – jwmLLL