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
文档:
通知所附的观察者的基础数据已 改变任何视图反映了数据集应刷新本身。
希望它有帮助!
移动将此代码
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
我做了这些改变,但仍然没有运气,这很奇怪,因为当我使用GridView代替Recyclerview时,它确实工作得很好,也许问题出在我的Recyclerview适配器中? –
顺便说一句,它说:“没有适配器连接;跳过布局”在logcats –
你可以尝试后更改此“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
老实说后工作,我不知道为什么它的工作笑,没有任何人有线索?
我不知道为什么,但它似乎并没有工作 –
你可以发布代码设置URL到MoviesData的代码? – jos
我已更新我的问题 –