2017-09-14 76 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)的下面;这会通知适配器新项目已添加到列表中。