2016-05-08 63 views
0

我想爲一個網站開發android應用程序。我從json閱讀網站帖子,並在每10個帖子的RecyclerView中顯示它,當用戶在RecyclerView上滾動顯示更多10帖子並結束時!在這個項目中我使用okHTTP v3RecyclerView
在Android上的RecyclerView中從Json載入更多數據

的Json鏈接:JSON LINK

我可以加載前10個職位。我想在RecyclerView顯示未來10後

SERVERIP類滾動時:

public class ServerIP_cat { 
    private static String IP = "http://tellfa.com/tafrihgah/?json=get_category_posts&"; 

    public static String getCatIP() { 
     return IP; 
    } 
} 

我的活動代碼:

public class Category_page extends AppCompatActivity { 

    private static final long RIPPLE_DURATION = 250; 
    private Toolbar toolbar; 
    private TextView toolbar_title; 
    private ImageView toolbar_menuImage; 
    private RelativeLayout root; 
    private MainAdapter_loadMore mAdapter; 
    private RecyclerView cat_recyclerView; 
    private List<MainDataModel> dataModels = new ArrayList<MainDataModel>(); 
    private LinearLayoutManager mLayoutManager; 
    private RelativeLayout loadLayout; 
    private String catTitle = "", catID = ""; 
    private Bundle bundle; 
    private int pageCount = 1; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.category_page); 
     //if (!EventBus.getDefault().isRegistered(this)) { 
     // EventBus.getDefault().register(this); 
     //} 

     // Initializing 
     toolbar = (Toolbar) findViewById(R.id.category_toolbar); 
     cat_recyclerView = (RecyclerView) findViewById(R.id.category_recycler); 
     toolbar_title = (TextView) toolbar.findViewById(R.id.toolbar_pages_title); 
     mLayoutManager = new LinearLayoutManager(this); 
     root = (RelativeLayout) findViewById(R.id.category_root); 
     loadLayout = (RelativeLayout) findViewById(R.id.category_empty_layout); 
     mAdapter = new MainAdapter_loadMore(this, cat_recyclerView, dataModels); 
     // Toolbar 
     setSupportActionBar(toolbar); 
     if (toolbar != null) { 
      getSupportActionBar().setTitle(""); 
     } 

     // Receive Data 
     bundle = getIntent().getExtras(); 
     catID = bundle.getString("categoryID"); 
     if (bundle != null) { 
      catTitle = bundle.getString("categoryTitle"); 
     } 
     if (catTitle != null) { 
      toolbar_title.setText(catTitle); 
     } 
     // Load data 
     LoadData(catID); 

     // Menu 
     View guillotineMenu = LayoutInflater.from(this).inflate(R.layout.menu_layout, null); 
     root.addView(guillotineMenu); 
     toolbar_menuImage = (ImageView) toolbar.findViewById(R.id.toolbar_pages_logo); 
     new GuillotineAnimation.GuillotineBuilder(guillotineMenu, guillotineMenu.findViewById(R.id.menu_layout_image), toolbar_menuImage) 
       .setStartDelay(RIPPLE_DURATION) 
       .setActionBarViewForAnimation(toolbar) 
       .setClosedOnStart(true) 
       .build(); 

     // RecyclerView 
     cat_recyclerView.setLayoutManager(mLayoutManager); 
     cat_recyclerView.setHasFixedSize(true); 
     cat_recyclerView.setAdapter(mAdapter); 
     // Load More data 
     mAdapter.setOnLoadMoreListener(new OnLoadMoreListener() { 
      @Override 
      public void onLoadMore() { 
       dataModels.add(null); 
       mAdapter.notifyItemInserted(dataModels.size() - 1); 
       LoadMoreData(catID, pageCount); 
      } 
     }); 
    } 

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

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

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

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

    public void post_back(View view) { 
     onBackPressed(); 
    } 

    private void LoadData(String CatID) { 
     CatDataInfo catDataInfo = new CatDataInfo(); 
     catDataInfo.getCatDataInfo(this, CatID); 
    } 

    private void LoadMoreData(String CatID, int pageNumber) { 
     CatDataInfo_loadMore catDataInfo_loadMore = new CatDataInfo_loadMore(); 
     catDataInfo_loadMore.getCatDataInfo_loadMore(this, CatID, pageNumber); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     EventBus.getDefault().register(this); 
    } 

    @Override 
    public void onPause() { 
     EventBus.getDefault().unregister(this); 
     super.onPause(); 
    } 
} 

AsynTask類:

public class CatDataInfo_loadMore { 
    private Context mContext; 
    private String ServerAddress = ServerIP_cat.getCatIP(); 

    public void getCatDataInfo_loadMore(Context context, String catID, int pageCount) { 
     mContext = context; 
     new getInfo().execute(ServerAddress + "id=" + catID + "&page=" + pageCount); 
    } 

    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(); 

      String url = (String) params[0]; 
      Request request = new Request.Builder() 
        .url(url) 
        .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); 
          // Thumbnail 
          JSONObject images = postObject.optJSONObject("thumbnail_images"); 
          JSONObject imagesPair = images.optJSONObject("medium"); 
          // Author 
          JSONObject Author = postObject.optJSONObject("author"); 
          // Category 
          JSONArray category = postObject.getJSONArray("categories"); 
          for (int j = 0; j < category.length(); j++) { 
           JSONObject categoryObject = category.getJSONObject(j); 

           int id = postObject.getInt("id"); 
           String title = postObject.getString("title"); 
           String content = postObject.getString("content"); 
           String dateTime = postObject.getString("date"); 
           String thumbnail = imagesPair.getString("url"); 
           String authorShow = Author.getString("name"); 
           String categoryShow = categoryObject.getString("title"); 
           String category_id = categoryObject.getString("id"); 

           Log.d("Data", "Post ID: " + id); 
           Log.d("Data", "Post title: " + title); 
           Log.d("Data", "Post image: " + thumbnail); 
           Log.d("Data", "Post author: " + authorShow); 
           Log.d("Data", "Post category: " + categoryShow); 
           Log.d("Data", "Post category ID: " + category_id); 
           Log.d("Data", "---------------------------------"); 

           //Use the title and id as per your requirement 
           infoModels.add(new MainDataModel(id, title, content, dateTime, authorShow, categoryShow, category_id, 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); 
      } 
     } 
    } 
} 

適配器類:

public class MainAdapter_loadMore extends RecyclerView.Adapter { 

    private List<MainDataModel> mDateSet; 
    private Context mContext; 

    private final int VIEW_ITEM = 1; 
    private final int VIEW_PROG = 0; 

    // The minimum amount of items to have below your current scroll position 
    // before loading more. 
    private int visibleThreshold = 7; 
    private int lastVisibleItem, totalItemCount; 
    private boolean loading; 
    private OnLoadMoreListener onLoadMoreListener; 

    public MainAdapter_loadMore(Context context, RecyclerView recyclerView, List<MainDataModel> dataSet) { 
     this.mContext = context; 
     this.mDateSet = dataSet; 

     if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) { 

      final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView 
        .getLayoutManager(); 
      recyclerView 
        .addOnScrollListener(new RecyclerView.OnScrollListener() { 
         @Override 
         public void onScrolled(RecyclerView recyclerView, 
               int dx, int dy) { 
          super.onScrolled(recyclerView, dx, dy); 
          totalItemCount = linearLayoutManager.getItemCount(); 
          lastVisibleItem = linearLayoutManager 
            .findLastVisibleItemPosition(); 
          if (!loading 
            && totalItemCount <= (lastVisibleItem + visibleThreshold)) { 
           // End has been reached 
           // Do something 
           if (onLoadMoreListener != null) { 
            onLoadMoreListener.onLoadMore(); 
           } 
           loading = true; 
          } 
         } 
        }); 
     } 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return mDateSet.get(position) != null ? VIEW_ITEM : VIEW_PROG; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     RecyclerView.ViewHolder vh; 
     if (viewType == VIEW_ITEM) { 
      View v = LayoutInflater.from(parent.getContext()).inflate(
        R.layout.post_card_layout, parent, false); 

      vh = new DataViewHolder(v); 
     } else { 
      View v = LayoutInflater.from(parent.getContext()).inflate(
        R.layout.progressbar_item, parent, false); 

      vh = new ProgressViewHolder(v); 
     } 
     return vh; 
    } 

    @Override 
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { 

     if (holder instanceof DataViewHolder) { 
      ((DataViewHolder) holder).main_post_title.setText(Html.fromHtml(mDateSet.get(position).getTitle())); 

      Glide.with(mContext) 
        .load(mDateSet.get(position).getThumbnail()) 
        .placeholder(R.drawable.post_image) 
        .crossFade() 
        .into(((DataViewHolder) holder).main_post_image); 

      ((DataViewHolder) holder).main_post_content.setText(Html.fromHtml(mDateSet.get(position).getContent())); 

      ((DataViewHolder) holder).main_dateTime.setText(Html.fromHtml(mDateSet.get(position).getDateTime())); 

      ((DataViewHolder) holder).main_author.setText(Html.fromHtml(mDateSet.get(position).getAuthor())); 

      ((DataViewHolder) holder).main_category.setText(Html.fromHtml(mDateSet.get(position).getCategory())); 
      ((DataViewHolder) holder).main_category.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        int pos = holder.getPosition(); 
        MainDataModel model = mDateSet.get(pos); 
        v.getContext().startActivity(new Intent(v.getContext(), Category_page.class) 
          .putExtra("categoryTitle", model.getCategory()) 
          .putExtra("categoryID", model.getCategoryID())); 
       } 
      }); 

      ((DataViewHolder) holder).main_post_image.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        int pos = holder.getPosition(); 
        MainDataModel model = mDateSet.get(pos); 
        v.getContext().startActivity(new Intent(v.getContext(), PostShow_page.class) 
          .putExtra("title", model.getTitle()) 
          .putExtra("image", model.getThumbnail()) 
          .putExtra("content", model.getContent()) 
          .putExtra("dateTime", model.getDateTime()) 
          .putExtra("author", model.getAuthor()) 
          .putExtra("category", model.getCategory())); 

       } 
      }); 

     } else { 
      ((ProgressViewHolder) holder).progressBar.setVisibility(View.VISIBLE); 
     } 
    } 

    public void setLoaded() { 
     loading = false; 
    } 

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

    public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) { 
     this.onLoadMoreListener = onLoadMoreListener; 
    } 

    public void remove(int position) { 
     mDateSet.remove(position); 
     notifyItemRemoved(position); 
    } 

    public void clear() { 
     mDateSet.clear(); 
     notifyDataSetChanged(); 
    } 


    public void add(List<MainDataModel> models) { 
     mDateSet.addAll(models); 
     notifyDataSetChanged(); 
    } 

    public void update(List<MainDataModel> models) { 
     mDateSet.clear(); 
     mDateSet.addAll(models); 
     notifyDataSetChanged(); 
    } 

    public class DataViewHolder extends RecyclerView.ViewHolder { 

     private TextView main_post_title, main_post_content, main_dateTime, main_author, main_category; 
     private ImageView main_post_image; 

     public DataViewHolder(final View itemView) { 
      super(itemView); 

      main_post_title = (TextView) itemView.findViewById(R.id.post_content_title); 
      main_post_image = (ImageView) itemView.findViewById(R.id.post_picture_image); 
      main_post_content = (TextView) itemView.findViewById(R.id.post_content_text); 
      main_dateTime = (TextView) itemView.findViewById(R.id.post_date_text); 
      main_author = (TextView) itemView.findViewById(R.id.post_name_text); 
      main_category = (TextView) itemView.findViewById(R.id.post_category_text); 
     } 
    } 

    public static class ProgressViewHolder extends RecyclerView.ViewHolder { 
     public AVLoadingIndicatorView progressBar; 

     public ProgressViewHolder(View v) { 
      super(v); 
      progressBar = (AVLoadingIndicatorView) v.findViewById(R.id.avloadingIndicatorView); 
     } 
    } 
} 

予取類別IDAdapter Class並用putExtra傳遞此。

負載更多的數據,我使用接口類:OnLoadMoreListener

我怎樣才能修復這個bug和崗位上滾動時,顯示未來10個職位!
注意:請不要給我負面的問題,幫助我,我真的需要你幫助!感謝所有< 3我該如何解決它?

回答

0

我發現我的問題!但我的問題很奇怪!我刪除了這段代碼:

mAdapter.setOnLoadMoreListener(new OnLoadMoreListener() { 
    @Override 
    public void onLoadMore() { 
     dataModels.add(null); 
     mAdapter.notifyItemInserted(dataModels.size() - 1); 
     LoadMoreData(catID, pageCount); 
    } 
}); 

並重新寫這個,解決我的問題!這很奇怪:D。
希望能幫到你

相關問題