2016-04-28 2 views
2

Ich möchte Android-Anwendung für eine Website zu entwickeln. Ich lese Website-Beiträge von Json und zeigen Sie es in RecyclerView alle 10 Beiträge und wenn Benutzer scrollen auf RecyclerView zeigen mehr 10 Post und gehen Sie zu Ende! In diesem Projekt verwende ich okHTTP v3 und RecyclerView!
Json Link: JSON LINK
Ich kann die ersten 10 Beiträge laden. Ich möchte beim Scrollen auf RecyclerView den nächsten 10 Beitrag anzeigen, aber zeig mir nochmal den ersten 10 Beitrag!So legen Sie laden nächste Seite Daten aus Daten in Android

MainActivity Codes:

public class Main_page extends AppCompatActivity { 

    private static final long RIPPLE_DURATION = 250; 
    private Toolbar toolbar; 
    private RelativeLayout root; 
    private ImageView menu_image; 
    private RecyclerView main_recyclerView; 
    private MainAdapter2 mAdaper; 
    private List<MainDataModel> dataModels = new ArrayList<MainDataModel>(); 
    private List<MainDataModel> dataModelsArray; 
    private Context context; 
    protected Handler handler; 
    private RelativeLayout loadLayout; 
    private LinearLayoutManager mLayoutManager; 
    private int pageCount = 1; 
    private String ServerAddress = ServerIP.getIP(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_page); 
     if (!EventBus.getDefault().isRegistered(this)) { 
      EventBus.getDefault().register(this); 
     } 
     handler = new Handler(); 
     context = getApplicationContext(); 
     loadLayout = (RelativeLayout) findViewById(R.id.main_empty_layout); 
     toolbar = (Toolbar) findViewById(R.id.main_toolbar); 
     if (toolbar != null) { 
      setSupportActionBar(toolbar); 
      getSupportActionBar().setTitle(null); 
     } 
     LoadData(pageCount); 
     mLayoutManager = new LinearLayoutManager(this); 
     // Menu 
     root = (RelativeLayout) findViewById(R.id.main_root); 
     View guillotineMenu = LayoutInflater.from(this).inflate(R.layout.menu_layout, null); 
     root.addView(guillotineMenu); 
     menu_image = (ImageView) toolbar.findViewById(R.id.toolbar_logo); 
     new GuillotineAnimation.GuillotineBuilder(guillotineMenu, guillotineMenu.findViewById(R.id.menu_layout_image), menu_image) 
       .setStartDelay(RIPPLE_DURATION) 
       .setActionBarViewForAnimation(toolbar) 
       .setClosedOnStart(true) 
       .build(); 
     // RecyclerView and setData 
     main_recyclerView = (RecyclerView) findViewById(R.id.main_recycler); 
     main_recyclerView.setHasFixedSize(true); 
     main_recyclerView.setLayoutManager(mLayoutManager); 

     mAdaper = new MainAdapter2(this, main_recyclerView, dataModels); 
     main_recyclerView.setAdapter(mAdaper); 

     mAdaper.setOnLoadMoreListener(new OnLoadMoreListener() { 
      @Override 
      public void onLoadMore() { 
       dataModels.add(null); 
       mAdaper.notifyItemInserted(dataModels.size() - 1); 
       LoadData(pageCount); 
      } 
     }); 
    } 

    @Subscribe 
    public void onEvent(List<MainDataModel> mainInfoModels) { 
     if (dataModels.size() > 0) { 
      dataModels.remove(dataModels.size() - 1); 
      mAdaper.notifyItemRemoved(dataModels.size()); 
      mAdaper.setLoaded(); 
     } 

     mAdaper.add(mainInfoModels); 
     mAdaper.notifyDataSetChanged(); 
     ++pageCount; 

     if (dataModels.isEmpty()) { 
      main_recyclerView.setVisibility(View.GONE); 
      loadLayout.setVisibility(View.VISIBLE); 

     } else { 
      main_recyclerView.setVisibility(View.VISIBLE); 
      loadLayout.setVisibility(View.GONE); 
     } 
    } 

    private void LoadData(int pageNumber) { 
     MainDataInfo dataInfo = new MainDataInfo(); 
     // here getMainDataInfo() should return the server response 
     dataInfo.getMainDataInfo(this, pageNumber); 
    } 
} 

AsyncTask Code:

public class MainDataInfo { 
    private Context mContext; 
    private String ServerAddress = ServerIP.getIP(); 

    public void getMainDataInfo(Context context, int pageNumber) { 
     mContext = context; 
     new getInfo().execute(ServerAddress + "page=" + pageNumber); 
    } 

    private class getInfo extends AsyncTask<String, Void, String> { 
     EventBus bus = EventBus.getDefault(); 
     private String ou_response; 
     private List<MainDataModel> infoModels; 

     @Override 
     protected void onPreExecute() { 
      CustomProcessDialog.createAndShow(mContext); 
      infoModels = new ArrayList<>(); 
     } 

     @Override 
     protected String doInBackground(String... params) { 
      OkHttpClient client = new OkHttpClient(); 

      Request request = new Request.Builder() 
        .url(ServerAddress + "page=1") 
        .cacheControl(CacheControl.FORCE_NETWORK) 
        .build(); 

      Response response; 
      try { 
       response = client.newCall(request).execute(); 
       ou_response = response.body().string(); 
       response.body().close(); 
       if (ou_response != null) { 
        try { 
         JSONObject postObj = new JSONObject(ou_response); 
         JSONArray postsArray = postObj.optJSONArray("posts"); 
         infoModels = new ArrayList<>(); 

         for (int i = 0; i <= infoModels.size(); i++) { 
          JSONObject postObject = (JSONObject) postsArray.get(i); 
          JSONObject images = postObject.optJSONObject("thumbnail_images"); 
          JSONObject imagesPair = images.optJSONObject("medium"); 

          int id = postObject.getInt("id"); 
          String title = postObject.getString("title"); 
          String content = postObject.getString("content"); 
          String thumbnail = imagesPair.getString("url"); 
          Log.d("Data", "Post id: " + id); 
          Log.d("Data", "Post title: " + title); 
          Log.d("Data", "Post title: " + thumbnail); 

          //Use the title and id as per your requirement 
          infoModels.add(new MainDataModel(id, title, content, thumbnail)); 
         } 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return ou_response; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      CustomProcessDialog.dissmis(); 
      if (result != null) { 
       bus.post(infoModels); 
      } 
     } 
    } 
} 

Wie kann nächsten 10 Post zeigen, wenn sie auf RecyclerView Instanz zeigen wieder die ersten 10 Post-Scrolling?

Antwort

0

Ich habe Ihren JSON überprüft, und wenn Sie die Seitenzahl erhöhen, gibt es kein Ergebnis. Bitte beheben Sie es zuerst, um Ihre Ergebnisse in Ihrer App zu zeigen.

Während this one Sie 10 nach der Rückkehr

Wenn Sie Ihre page number 2 gesetzt, es keine Post zurückkehrt, das ist, warum Sie jedes Mal die ersten 10 Post zu sehen sind.

Ich hoffe, es hilft.

+0

Danke Emir, ich repariere es bitte diesen Link: http://tellfa.com/tafrihgah/?json=get_posts&page=2. ist es wahr? –

+0

Nein, mein Freund, Sie erhalten Ihren JSON mit Paginierung in Ihrer App, indem Sie die Seitenzahlen erhöhen. Aber in Ihrer JSON API gibt es nur Ergebnisse für die Seitennummer = 1 zurück. –

+0

Sie sollten Ihre API wie folgt verwenden: http://tellfa.com/tafrihgah/?json=get_posts&page=1&limit=10 und erhöhen Sie Ihre Grenzwert statt Seitennummer 10 von 10 –

0

Sie müssen verschiedene Seiten erstellen. Eine Seite hat Daten von nur 10 Blogs. Um Informationen zu erhalten, fordern Sie JSON von der nächsten Seite an, wenn das 10. Element angezeigt wird. Um Artikelinformationen zu erhalten, können Sie layoutManager.findLastVisbleItem() oder lastComletlyVisibleItem() verwenden.

sobald die angeforderten Daten heruntergeladen sind. Es muss eine Methode wie onRequestComleted() in Volley geben. notificesetChanged dort.

+0

Ich benutze die OkHTTP-Bibliothek, können Sie mir echten Code senden? Weil ich Amateur bin –

Verwandte Themen