2016-07-28 118 views
0

我正在使用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; 


    } 

回答

0

嘗試內部調用:

adapter.notifyDataSetChanged(); 

之後致電getMoviesDataFromJson方法。

notifyDataSetChanged文檔:

通知所附的觀察者的基礎數據已 改變任何視圖反映了數據集應刷新本身。

希望它有幫助!

+0

我不知道爲什麼,但它似乎並沒有工作 –

+0

你可以發佈代碼設置URL到MoviesData的代碼? – jos

+0

我已更新我的問題 –

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

0

後初始化moviesDatas = new ArrayList<>();getMoviesDataFromJson即使沒有notifyDataSetChanged 老實說後工作,我不知道爲什麼它的工作笑,沒有任何人有線索?

相關問題