簡體   English   中英

notifydatasetchanged()不更新回收站視圖

[英]notifydatasetchanged() is not updating the recycler view

我正在嘗試使用ASYNC任務通過API更新圖像中的recyclerview,但其無法正常工作。 問題在於ASYNC任務的onPostExecute()中的notifyDataSetChanged()方法。 我已經檢查了json響應,並且onPostExecute()的結果值正確,但是notifydatasetchanged()並未使用新數據更新適配器。

主要活動 :

public class MainActivity extends AppCompatActivity {

    public static final String LOG_TAG = MainActivity.class.getName();
    public MovieUtils utils = new MovieUtils();


    private RecyclerView mRecyclerView;
    private MovieAdapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    public ArrayList<String> movieData=new ArrayList<String>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
        mRecyclerView.setHasFixedSize(true);
        //Using a grid layout manager to display the movies in a grid view.
        mLayoutManager = new GridLayoutManager(getApplicationContext(), 2);
        mRecyclerView.setLayoutManager(mLayoutManager);
        //using the jsonParser to parse the String response and create a new data set.
        // passing the data to the Adapter.
        mAdapter = new MovieAdapter(movieData, getApplicationContext());
        mRecyclerView.setAdapter(mAdapter);
        DownloadMovieDetail downloadMovieDetail= new DownloadMovieDetail();
        downloadMovieDetail.execute();

    }

    private class DownloadMovieDetail extends AsyncTask<String, Void, ArrayList<String>> {

        @Override
        protected ArrayList<String> doInBackground(String... params) {
            ArrayList<String> movieDb = new ArrayList<String>();
            try {
                movieDb = utils.downloadMovie(responseString);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return movieDb;
        }

        @Override
        protected void onPostExecute(ArrayList<String> strings) {
            movieData.addAll(strings);
            Log.v(LOG_TAG,"the movie data"+movieData.toString());
            mAdapter.notifyDataSetChanged();
        }
    }
}

電影適配器:

public class MovieAdapter extends       RecyclerView.Adapter<MovieAdapter.ViewHolder> {
    public static final String LOG_TAG = MovieAdapter.class.getName();

    public ArrayList<String> dummyData;
    public Context context;

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public ImageView MovieImageView;
        public ViewHolder(View itemView) {
            super(itemView);
            MovieImageView=(ImageView) itemView.findViewById(R.id.movie_image);
        }
    }

    //Constructor for the adapter.
    public MovieAdapter(ArrayList<String> data, Context c){
        this.context=c;
        dummyData=data;
    }


    @Override
    public MovieAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.movie_view, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(MovieAdapter.ViewHolder holder, int position) {
        Picasso.with(context).load(dummyData.toString()).into(holder.MovieImageView);

    }

    @Override
    public int getItemCount()
    {
        return dummyData.size();
    }
}

像這樣在您的適配器中為dummyData ArrayList定義一個setter

public void setDummyData(ArrayList<String> data){
     this.dummyData = data;
     notifyDataSetChanged();
}

然后onPostExecute()替換

mAdapter.notifyDataSetChanged();

mAdapter.setDummyData(movieData);

您沒有更改適配器類上的數據。 ArrayList創建一個setter,然后調用notifyDataSetChanged()

public void setList(ArrayList<String> dummyData){
   this.dummyData = dummyData;
   notifyDataSetChanged();
}

然后在onPostExecute上調用

adapter.setList(string);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM