Recyclerview适配器数据不会更改

时间:2016-07-28 20:02:03

标签: android json android-recyclerview sharedpreferences

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


    }

3 个答案:

答案 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,有人有线索吗?

相关问题