我正在使用Recyclerview适配器将图像放入Recyclerview中 我的代码逻辑是在解析之后从JSON获取图像URL,然后适配器应该将图像放在Recyclerview中。 图像URL取决于某些SharedPreferences,但问题是当SharedPreferences更改图像不随其更改时,它们仅在我重新启动应用程序时更改
我的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);
}}
这个函数我在MoviesData类中设置了所有数据(包括图像URL)
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;
}
答案 0 :(得分:0)
尝试致电:
adapter.notifyDataSetChanged();
调用getMoviesDataFromJson
方法后。
来自notifyDataSetChanged
的文档:
通知附加的观察者基础数据已经存在 已更改,任何反映数据集的视图都应自行刷新。
希望它有所帮助!
答案 1 :(得分:0)
移动此代码
class SidebarnaviItem {
isOpen: boolean = false;
constructor(public name?: string, public route?: any, public children?: SidebarnaviItem[]) {}
}
<ul>
<li *ngFor="let row of sidebaritem;" [class.open]="row.isOpen">
<a (click)="row.isOpen = !row.isOpen">{{row.title}}</a>
<ul>
<li *ngFor="let child of row.children">
<a [routerLink]="child.route">{{child.name}}</a>
</li>
</ul>
</li>
</ul>
从 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();
}
中使用名为setData
的方法。
RecyclerViewAdapter
P.S。:编辑public void setData(ArrayList<MoviesData> array) {
this.array = array;
}
commit
答案 2 :(得分:0)
即使没有moviesDatas = new ArrayList<>();
,在getMoviesDataFromJson
内初始化notifyDataSetChanged
后也能正常工作
说实话,我不知道为什么它有效lol,有人有线索吗?