2017-09-14 80 views
1

我是新來的android。我嘗試使用Github API下載數據並顯示並無限滾動RecyclerView,JSON數據已被解析,但不知何故數據未附加到recyclerview。 這裏是下面的代碼:數據不綁定到android recyclerview

Developer_RV_Adapter.java 
package com.davidshare.githubdevelopers; 

import android.content.Context; 
import android.content.Intent; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
import android.widget.ProgressBar; 
import android.widget.TextView; 

import com.squareup.picasso.Picasso; 

import java.util.List; 

/** 
* Created by GemShare on 9/6/2017. 
*/ 
public class Developer_RV_Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    private final int VIEW_TYPE_ITEM = 0; 
    private final int VIEW_TYPE_LOADING = 1; 
    private OnLoadMoreListener mOnLoadMoreListener; 
    private boolean isLoading; 
    private int visibleThreshold = 10; 
    private int lastVisibleItem, totalItemCount; 
    private List<Developer> developerList; 
    Context context; 
    RecyclerView recyclerView; 

    public Developer_RV_Adapter(Context context, List<Developer> developerList, RecyclerView recyclerView) { 
     this.developerList = developerList; 
     this.context = context; 
     this.recyclerView = recyclerView; 

     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(!isLoading && totalItemCount<=(lastVisibleItem+visibleThreshold)){ 
        if(mOnLoadMoreListener!=null){ 
         mOnLoadMoreListener.onLoadMore(); 
        } 
        isLoading = true; 
       } 
      } 
     }); 
    } 

    public void setmOnLoadMoreListener(OnLoadMoreListener mOnLoadMoreListener){ 
     this.mOnLoadMoreListener = mOnLoadMoreListener; 
    } 

    @Override 
    public int getItemViewType(int position){ 
     return developerList.get(position) == null? VIEW_TYPE_LOADING : VIEW_TYPE_ITEM; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     if(viewType == VIEW_TYPE_ITEM){ 
      View developerView = LayoutInflater.from(context).inflate(R.layout.developer_list_item, parent, false); 
      return new DeveloperViewHolder(developerView); 
     }else if(viewType== VIEW_TYPE_LOADING){ 
      View loadingView = LayoutInflater.from(context).inflate(R.layout.progress_bar_item, parent, false); 

      return new ProgressViewHolder(loadingView); 
     } 
     return null; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     Log.w("binder function", "Just entered the binder"); 
     Developer developer = developerList.get(position); 
     if(holder instanceof DeveloperViewHolder){ 
      DeveloperViewHolder developerViewHolder = (DeveloperViewHolder) holder; 
      developerViewHolder.gitNameTv.setText(developer.getGitUsername()); 
      Log.w("binder ", developer.getGitProfileUrl()); 
      developerViewHolder.gitUrlTv.setText(developer.getGitProfileUrl()); 
      developerViewHolder.gitPicUrlTv.setText(developer.getGitProfilePicUrl()); 
      Log.w("profile pic", developer.getGitProfilePicUrl()); 
      Picasso.with(developerViewHolder.gitNameTv.getContext()).load(developer.getGitProfilePicUrl()).transform(new RoundedImage(2)).fit().centerCrop().into(developerViewHolder.profilePicImgV); 
     }else if (holder instanceof ProgressViewHolder) { 
      ProgressViewHolder loadingViewHolder = (ProgressViewHolder) holder; 
      loadingViewHolder.loadingProgress.setIndeterminate(true); 
     } 
    } 

    @Override 
    public int getItemCount() { 
     return developerList == null ? 0 : developerList.size(); 
    } 

    public void setLoaded() { 
     isLoading = false; 
    } 

    public class DeveloperViewHolder extends RecyclerView.ViewHolder{ 
     TextView gitNameTv; 
     TextView gitUrlTv; 
     ImageView profilePicImgV; 
     TextView gitPicUrlTv; 

     public DeveloperViewHolder(final View itemView) { 
      super(itemView); 
      gitNameTv = (TextView) itemView.findViewById(R.id.developerName); 
      gitUrlTv = (TextView) itemView.findViewById(R.id.developerUrl); 
      profilePicImgV = (ImageView) itemView.findViewById(R.id.developerPic); 
      gitPicUrlTv = (TextView) itemView.findViewById(R.id.developerPicUrl); 
      itemView.setOnClickListener(new View.OnClickListener(){ 
       @Override 
       public void onClick(View v){ 
        Intent i = new Intent(itemView.getContext(), Profile.class); 
        i.putExtra("profile_name", gitNameTv.getText().toString()); 
        i.putExtra("profile_url", gitUrlTv.getText().toString()); 
        i.putExtra("profile_pic_url", gitPicUrlTv.getText().toString()); 
        v.getContext().startActivity(i); 
       } 
      }); 
     } 
    } 

    public static class ProgressViewHolder extends RecyclerView.ViewHolder{ 
     public ProgressBar loadingProgress; 

     public ProgressViewHolder(View itemView) { 
      super(itemView); 
      loadingProgress = (ProgressBar) itemView.findViewById(R.id.loading_progress_bar); 
     } 
    } 
} 



DeveloperList.java 
package com.davidshare.githubdevelopers; 

import android.app.ProgressDialog; 
import android.os.Handler; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 

import com.android.volley.Request; 
import com.android.volley.RequestQueue; 
import com.android.volley.Response; 
import com.android.volley.VolleyError; 
import com.android.volley.toolbox.StringRequest; 
import com.android.volley.toolbox.Volley; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

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

public class DeveloperList extends AppCompatActivity { 
    List<Developer> developerList; 
    Developer_RV_Adapter developer_rv_adapter; 
    Developer developer; 
    RecyclerView developerRV; 
    private static final String GIT_BASE_URL = "https://api.github.com/search/users?q=location:"; 
    private static int page = 1; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_developer_list); 
     developerRV = (RecyclerView) findViewById(R.id.developer_rv); 
     developerRV.setLayoutManager(new LinearLayoutManager(this)); 
     developerList = new ArrayList<>(); 
     getDevelopersData(prepareQuery("java", "lagos", page)); 
     developer_rv_adapter = new Developer_RV_Adapter(DeveloperList.this, developerList, developerRV); 
     developerRV.setAdapter(developer_rv_adapter); 
     developer_rv_adapter.setmOnLoadMoreListener(new OnLoadMoreListener() { 
      @Override 
      public void onLoadMore() { 
       developerList.add(null); 
       developer_rv_adapter.notifyItemInserted(developerList.size()-1); 
       new Handler().postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         developerList.remove(developerList.size()-1); 
         developer_rv_adapter.notifyItemRemoved(developerList.size()); 
         getDevelopersData(prepareQuery("java", "lagos", page)); 
         developer_rv_adapter.notifyDataSetChanged(); 
         developer_rv_adapter.setLoaded(); 
        } 
       }, 5000); 
      } 
     }); 
    } 

的getDevelopersData方法使用凌空查詢GitHub的API和解析JSON響應轉換成一個列表

public void getDevelopersData(String requestUrl) { 
     StringRequest jsonSringRequest = new StringRequest(Request.Method.GET, requestUrl, new Response.Listener<String>() { 
      @Override 
      public void onResponse(String jsonResponse) { 
       try { 
        JSONObject gitJSONOBject = new JSONObject(jsonResponse); 
        JSONArray gitItemsArray = gitJSONOBject.getJSONArray("items"); 

        for (int i = 0; i < gitItemsArray.length(); i++) { 
         JSONObject developerObject = gitItemsArray.getJSONObject(i); 
         developer = new Developer(developerObject.getString("login"), 
           developerObject.getString("html_url"), 
           developerObject.getString("avatar_url")); 
         developerList.add(developer); 
         Log.w("developer_data ", developer.getGitUsername()); 
        } 
        Log.w("JSON DATA", "getting the json data"); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     }, 
       new Response.ErrorListener() { 
        @Override 
        public void onErrorResponse(VolleyError volleyError) { 
         Log.e("Volley error", volleyError.getMessage()); 
        } 
       }); 

     RequestQueue requestQueue = Volley.newRequestQueue(this); 
     requestQueue.add(jsonSringRequest); 
    } 
//get the location and language and the page of the api data you want to load 
    private String prepareQuery(String language, String location, int page){ 
     this.page++; 
     String queryUrl = GIT_BASE_URL+location+"+language:"+language+"&page="+page+"&per_page=50"; 
     Log.w("Query URL = > ", queryUrl); 
     return queryUrl; 
    } 

} 

誰能幫助我?

回答

0

嘗試通過getDevelopersData()中的數據添加到數組列表之後通知適配器,如添加此行developer_rv_adapter.notifyDataSetChanged();

0

相反notifyItemInserted()插入使用

notifyItemRangedChanged(fromIndex,toIndex); 

這將通知一些數據集是整個數據中改變適配器,它告訴該適配器應該刷新數據,然後重新將適配器recyclerView從fromIndex開始到toIndex傳入方法。

如果所有的數據被更改,然後使用:

notifyDataSetChanged(); 

如果只有一個DataItem的更改,然後使用:

notifyItemChanged(dataPosition); 

而且我認爲這statment導致problem.Try刪除此statment和再檢查一遍。

new Handler().postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        developerList.remove(developerList.size()-1); 
        developer_rv_adapter.notifyItemRemoved(developerList.size()); 
        getDevelopersData(prepareQuery("java", "lagos", page)); 
        developer_rv_adapter.notifyDataSetChanged(); 
        developer_rv_adapter.setLoaded(); 
       } 
      }, 5000); 
+0

這段代碼沒有錯,它效果不錯 –

+0

notifyDataSetChanged();作品也 –

+0

添加處理程序沒有參考有時會導致問題..所以我說 – Anonymous

0

的問題是由剛剛加入developer_rv_adapter.notifyDataSetChanged()解決;就在developerList.add(developer)的下面;這會通知適配器新項目已添加到列表中。