Recyclerview适配器数据不会更改

问题描述:

我正在使用Recyclerview适配器将图像放入Recyclerview中 我的代码逻辑是在解析它之后从JSON获取图像URL,然后适配器应将图像放入Recyclerview中。 的图像URL取决于某些SharedPreferences,但问题是当SharedPreferences改变图像不会随之改变,他们只当我重新启动应用程序更改Recyclerview适配器数据不会更改

我Recyclerview适配器:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> { 

public Context context; 
public ArrayList<MoviesData> array; 
public LayoutInflater inflater; 


RecyclerViewAdapter(Context context,ArrayList<MoviesData> array) 
{ 
    this.context = context; 
    this.array = array; 
    this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 



public class ViewHolder extends RecyclerView.ViewHolder { 

    ImageView image; 


    public ViewHolder(View itemView) { 
     super(itemView); 
     image = (ImageView) itemView.findViewById(R.id.oneMovieBlockImageView); 
    } 



} 

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

    View rootview = inflater.inflate(R.layout.movie_block,parent,false); 

    ViewHolder viewHolder = new ViewHolder(rootview); 

    return viewHolder; 
} 

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

    Picasso.with(context).load(array.get(position).getPoster_path()).into(holder.image); 

} 

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

onPostExecute方法

@Override 
    protected void onPostExecute(ArrayList<MoviesData> result) { 
     if (result != null) { 

      recyclerView = (RecyclerView) getActivity().findViewById(R.id.recyclerview); 

      adapter = new RecyclerViewAdapter(getActivity(),moviesDatas); 
      recyclerView.setAdapter(adapter); 
      recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 



     } 
    } 

这是图像URL应该如何取决于SharedPreferences改变

if(sortByStr.equals("popular")) 
      { 
       url = new URL("http://api.themoviedb.org/3/movie/popular?api_key=9a005dd380ec772cf6045b8c370f8ef7"); 
      } 

      else if(sortByStr.equals("top_rated")) 
      { 
       url = new URL("http://api.themoviedb.org/3/movie/top_rated?api_key=9a005dd380ec772cf6045b8c370f8ef7"); 
      } 

      urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.setRequestMethod("GET"); 
      urlConnection.connect(); 

我MoviesData类在那里我收集里面

public class MoviesData implements Parcelable{ 

MoviesData() 
{ 


} 

private String title,rate,release,overview,poster_path; 

protected MoviesData(Parcel in) { 
    title = in.readString(); 
    rate = in.readString(); 
    release = in.readString(); 
    overview = in.readString(); 
    poster_path = in.readString(); 
} 

public static final Creator<MoviesData> CREATOR = new Creator<MoviesData>() { 
    @Override 
    public MoviesData createFromParcel(Parcel in) { 
     return new MoviesData(in); 
    } 

    @Override 
    public MoviesData[] newArray(int size) { 
     return new MoviesData[size]; 
    } 
}; 

public void setTitle(String title) { 
    this.title = title; 
} 

public void setRate(String rate) { 
    this.rate = rate; 
} 

public void setRelease(String release) { 
    this.release = release; 
} 

public void setOverview(String overview) { 
    this.overview = overview; 
} 

public void setPoster_path(String poster_path) { 
    this.poster_path = "http://image.tmdb.org/t/p/w185" + poster_path; 
} 

//////////////////////////////////////////////////// 

public String getTitle() { 
    return title; 
} 

public String getRate() { 
    return rate; 
} 

public String getRelease() { 
    return release; 
} 

public String getOverview() { 
    return overview; 
} 

public String getPoster_path() { 
    return poster_path; 
} 

@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeString(title); 
    dest.writeString(rate); 
    dest.writeString(release); 
    dest.writeString(overview); 
    dest.writeString(poster_path); 
}} 

而这个功能在哪里设置的所有数据(包括图片URL)中的所有数据MoviesData类

private ArrayList<MoviesData> getMoviesDataFromJson(String moviesJsonStr) throws JSONException 
    { 


     JSONObject forecastJson = new JSONObject(moviesJsonStr); 
     JSONArray moviesArray = forecastJson.getJSONArray("results"); 


     for(int i = 0; i <moviesArray.length(); i++) 
     { 


      JSONObject movieObject = moviesArray.getJSONObject(i); 


      MoviesData movie = new MoviesData(); 

      movie.setPoster_path(movieObject.getString("poster_path")); 
      movie.setTitle(movieObject.getString("title")); 
      movie.setOverview(movieObject.getString("overview")); 
      movie.setRate(movieObject.getString("vote_average")); 
      movie.setRelease(movieObject.getString("release_date")); 
      moviesDatas.add(movie); 

     } 


     return moviesDatas; 


    } 

尝试内部调用:

adapter.notifyDataSetChanged(); 

之后致电getMoviesDataFromJson方法。

notifyDataSetChanged文档:

通知所附的观察者的基础数据已 改变任何视图反映了数据集应刷新本身。

希望它有帮助!

+0

我不知道为什么,但它似乎并没有工作 –

+0

你可以发布代码设置URL到MoviesData的代码? – jos

+0

我已更新我的问题 –

移动将此代码

recyclerView = (RecyclerView) getActivity().findViewById(R.id.recyclerview); 
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 

onPostExecute从到onActivityCreated。在onPostExecute检查适配器是否为空。如果它是null创建它,但不是null刷新其数据。

if (adapter == null) { 
     adapter = new RecyclerViewAdapter(getActivity(), moviesDatas); 
     recyclerView.setAdapter(adapter); 
    } else { 
     adapter.setData(moviesDatas); 
     adapter.notifyDataSetChanged(); 
    } 

你需要一个在RecyclerViewAdapter称为setData方法。

public void setData(ArrayList<MoviesData> array) { 
    this.array = array; 
} 

P.S:不要忘记commit编辑SharedPreferences

+0

我做了这些改变,但仍然没有运气,这很奇怪,因为当我使用GridView代替Recyclerview时,它确实工作得很好,也许问题出在我的Recyclerview适配器中? –

+0

顺便说一句,它说:“没有适配器连接;跳过布局”在logcats –

+0

你可以尝试后更改此“Picasso.with(context).load(array.get(position).getPoster_path())。(holder.image );”在onBindViewHolder到“ViewHolder viewHolder =(ViewHolder)持有者; Picasso.with(context).load(array.get(position).getPoster_path())。into(viewHolder.image);” – faranjit

后初始化moviesDatas = new ArrayList<>();getMoviesDataFromJson即使没有notifyDataSetChanged 老实说后工作,我不知道为什么它的工作笑,没有任何人有线索?