2016-07-28 10 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(); 

私は

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クラスに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

移動onActivityCreatedからonPostExecuteからこのコード

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

onPostExecuteにチェックアダプターがnullかどうか。 nullの場合は作成しますが、nullのデータは更新されません。

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

あなたはRecyclerViewAdaptersetDataと呼ばれる方法を必要としています。

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

P.S:いけないそれは私がそれが笑働いた理由はわかりません正直に言うとさえnotifyDataSetChanged なしgetMoviesDataFromJson内部moviesDatas = new ArrayList<>();を初期化した後に働いたSharedPreferences

+0

私はこれらの変更を行いましたが、まだ運がない、それはRecyclerviewの代わりにGridViewを使用したときにうまくいきました。おそらく問題は私のRecyclerviewアダプタの中にありますか? –

+0

Btw、Logcatsに "No adapter attached;レイアウトをスキップする"と表示されます –

+0

このPicasso.with(context).load(array.get(position).getPoster_path())。into(holder.image ); " onBindViewHolderで "ViewHolder viewHolder =(ViewHolder)holder; Picasso.with(context).load(array.get(position).getPoster_path())。into(viewHolder.image);" – faranjit

0

を編集した後commitを忘れて、誰もが手掛かりを持っていますか?

関連する問題