2012-03-01 28 views
6

Tôi đang cố gắng tạo Hoạt động sẽ đóng vai trò là Chế độ xem theo ngày của Lịch. Khi người dùng vuốt sang trái hoặc sang phải, họ sẽ chuyển sang ngày mai hoặc ngày hôm qua, v.v. qua lịch.Hoạt động bằng cách sử dụng ViewPager, PagerAdapter và AsyncTask khiến chế độ xem trống

Tôi quyết định sử dụng ViewPager/PagerAdapter để xử lý chế độ xem và kiểm soát phân trang qua ngày.

Là một phần của việc thiết lập Chế độ xem theo ngày, ứng dụng sẽ chuyển đến API của tôi và yêu cầu bất kỳ cuộc hẹn nào cho ngày đó. Các cuộc hẹn sẽ được trả lại và hiển thị cho ngày đó. Để lấy dữ liệu từ API, tôi đang sử dụng AsyncTask. Về cơ bản, instantiateItem() gọi API và thiết lập listView trống. Sau đó, BroadcastReceiver sẽ nhận phản hồi, phân tích dữ liệu và hiển thị dữ liệu đó.

Sự cố tôi gặp phải là chế độ xem đầu tiên được hiển thị luôn trống. Các chế độ xem ở bên trái hoặc bên phải, được điền và nếu tôi đi hai vị trí theo một trong hai hướng, đủ để chế độ xem ban đầu bị hủy, sau đó quay lại chế độ xem ban đầu, nó có dữ liệu. Tại sao? Làm thế nào để làm cho có được cái nhìn đầu tiên được dân cư mà không cần phải di chuyển trên 2 swipes?

Đây là hoạt động của tôi. Hiện tại tôi không phân tích dữ liệu từ API, chỉ mô phỏng bằng danh sách các chuỗi trong thời gian có nghĩa.

public class MyPagerActivity extends Activity { 

    private ViewPager myPager; 
    private static int viewCount = 1000; 
    private Context ctx; 
    private MyPagerAdapter myAdapter; 

    private static final String tag = "MyPagerActivity"; 

    private static final String apiAction = "getAppointmentsForDate"; 
    private static final String apiUri = "https://myAPI.com/api.php"; 
    private static final String resource = "appointments"; 
    private static final String action = "getappointmentsfordate"; 
    private static final String date = "20120124"; 
    private ProgressDialog progress; 
    private SharedPreferences loginPreferences; 
    private SharedPreferences.Editor loginPreferencesEditor; 
    private ListView v; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     ctx = this; 

     myAdapter = new MyPagerAdapter(); 
     myPager = (ViewPager) findViewById(R.id.myPager); 
     myPager.setAdapter(myAdapter); 
     myPager.setCurrentItem(500); 
    } 

    private class MyPagerAdapter extends PagerAdapter { 


     @Override 
     public int getCount() { 
      return viewCount; 
     } 

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

      try { 
       Log.d(tag, "trying http connection"); 
       loginPreferences = getSharedPreferences("loginPrefs", MODE_PRIVATE); 
       loginPreferencesEditor = loginPreferences.edit(); 
       String authToken = loginPreferences.getString("authToken", ""); 
       String staffOrRoomsId = loginPreferences.getString("staffOrRoomsId", ""); 
       String staffOrRoomsIdName = loginPreferences.getString("staffOrRoomsIdName", ""); 

       HttpPost apiRequest = new HttpPost(new URI(apiUri)); 
       List<NameValuePair> parameters = new ArrayList<NameValuePair>(); 
       parameters.add(new BasicNameValuePair("authToken", authToken)); 
       parameters.add(new BasicNameValuePair("resource", resource)); 
       parameters.add(new BasicNameValuePair("action", action)); 
       parameters.add(new BasicNameValuePair("date", date)); 
       parameters.add(new BasicNameValuePair(staffOrRoomsIdName, staffOrRoomsId)); 
       apiRequest.setEntity(new UrlEncodedFormEntity(parameters)); 

       RestTask task = new RestTask(ctx, apiAction); 
       task.execute(apiRequest); 
       //Display progress to the user 
    //   progress = ProgressDialog.show(ctx, "Searching", "Waiting For Results...", true); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      Log.d(tag, "Creating another view! Position: " + position); 

      myPager.setTag(collection); 

      v = new ListView(ctx); 
      ((ViewPager) collection).addView(v, 0); 
      return v; 
     } 

     @Override 
     public void destroyItem(View collection, int position, Object view) { 
      Log.d(tag, "Destroying position: " + position + "!"); 
      ((ViewPager) collection).removeView((ListView) view); 
     } 

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

     @Override 
     public void finishUpdate(View arg0) {} 

     @Override 
     public void restoreState(Parcelable arg0, ClassLoader arg1) {} 

     @Override 
     public Parcelable saveState() { 
      return null; 
     } 

     @Override 
     public void startUpdate(View arg0) {} 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     registerReceiver(receiver, new IntentFilter(apiAction)); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     unregisterReceiver(receiver); 
    } 

    private BroadcastReceiver receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      //Clear progress indicator 
      if (progress != null) { 
       progress.dismiss(); 
      } 

      Log.d(tag, "Broadcast received"); 

      String[] from = new String[] { "str" }; 
      int[] to = new int[] { android.R.id.text1 }; 
      List<Map<String, String>> items = new ArrayList<Map<String, String>>(); 
      for (int i = 0; i < 20; i++) 
      { 
       Map<String, String> map = new HashMap<String, String>(); 
       map.put("str", String.format("Item %d", i + 1)); 
       items.add(map); 
      } 
      SimpleAdapter adapter = new SimpleAdapter(ctx, items, android.R.layout.simple_list_item_1, from, to); 
      v.setAdapter(adapter); 
     } 
    }; 
} 

Cảm ơn bạn đã dành thời gian để xem lại câu hỏi này!

+0

chúng tôi đang gặp sự cố tương tự khi kết quả cũ vẫn được hiển thị cho đến khi vuốt sang trước hoặc lùi lại từ 1 đến 3 địa điểm. chúng tôi đang sử dụng kết hợp pageradapter/viewpager. là giải pháp sử dụng phân đoạn cho mỗi trang? –

Trả lời

4

Theo mặc định, ViewPager không chỉ tải trang hiện tại mà còn cả trang ở hai bên. Đây là offscreenPageLimit. Giá trị tối thiểu là 1.

instantiateItem sẽ được gọi cho mỗi trang mà nó muốn tạo. Khi triển khai instantiateItem, bạn đang bắt đầu một AsyncTask và chỉ định giá trị cho v. Chỉ cuộc gọi cuối cùng đến số instantiateItem (tức là trang cuối cùng tối đa offscreenPageLimit) sẽ được chỉ định chính xác v và do đó trang đầu tiên sẽ không được điền ban đầu.

Bạn không thể dựa vào cuộc gọi cuối cùng tới instantiateItem để hướng bạn đến trang hiện đang hoạt động. Tôi sẽ chuyển sang sử dụng Phân đoạn cho mỗi trang, duy trì yêu cầu HTTP của riêng nó và ListView.

+0

Bạn có thể kiểm tra xem vấn đề của mình có mở rộng vấn đề tương tự này không - http://stackoverflow.com/questions/30555067/viewpager-not-displaying-content-of-first-view-that-is-being-opened –

Các vấn đề liên quan