gpt4 book ai didi

java - AsyncTask 不刷新 UI

转载 作者:行者123 更新时间:2023-12-02 08:43:15 24 4
gpt4 key购买 nike

我有一个应用程序,我可以通过 AsyncTask 中的 API 检索电影海报。我需要显示评分最高热门电影。因此,我的选项菜单中有热门最高评价。打开应用程序时,它会通过 AsyncTask 加载 (20) 部热门电影。现在的问题是,在我的选项菜单中单击热门或评分最高的选项时,它会将新获取的 (20) 海报添加到 UI 上已存在的 (20) 个海报中(现在为 40 部电影),而不是清除 UI 上的海报屏幕并替换为新获取的 20 张电影海报。

我尝试在适配器上调用notifyDataSetChanged()。另外,我尝试为每个单击的选项调用一个新的 AsyncTask,但都不起作用。我已经尝试过 this thread 上的选项但没有效果。

这是我的代码:

package com.quwaysim.popularmovies.ui;

import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.quwaysim.popularmovies.MovieAdapter;
import com.quwaysim.popularmovies.R;
import com.quwaysim.popularmovies.model.MovieDetails;
import com.quwaysim.popularmovies.utils.NetworkUtils;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
RecyclerView mRecyclerView;
MovieAdapter mAdapter;
ArrayList<MovieDetails> mMovieList = new ArrayList<>();

ProgressBar mProgressBar;
String api = "popular";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mProgressBar = findViewById(R.id.progressBar);
mRecyclerView = findViewById(R.id.movies_rv);

fetchMovies(api);
}

public void fetchMovies(String api) {
URL apiURL = NetworkUtils.buildUrl(api);
new FetchMovie().execute(apiURL);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.sort_menu, menu);
return true;
}


@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.popular:
Toast.makeText(this, "Popular", Toast.LENGTH_SHORT).show();

// Trying my options here
URL popular = NetworkUtils.buildUrl("popular");
new FetchMovie().execute(popular);
mAdapter.notifyDataSetChanged();
return true;
case R.id.top_rated:
Toast.makeText(this, "Top Rated", Toast.LENGTH_SHORT).show();

// Trying my options here
URL topRated = NetworkUtils.buildUrl("top_rated");
new FetchMovie().execute(topRated);
mAdapter.notifyDataSetChanged();
return true;
default:
return super.onOptionsItemSelected(item);

}
}



public class FetchMovie extends AsyncTask<URL, Void, String> {
private final String TAG = "FetchMovieAsyncTask";

private int mNoOfMovies;

@Override
protected void onPreExecute() {
mProgressBar.setVisibility(View.VISIBLE);
super.onPreExecute();
}

@Override
protected String doInBackground(URL... urls) {
URL url = urls[0];
String movieResults = null;
try {
movieResults = NetworkUtils.getResponseFromUrl(url);
} catch (IOException e) {
Log.d(TAG, "doInBackground: " + e);
}
return movieResults;
}

@Override
protected void onPostExecute(String s) {
if (s != null && !s.equals("")) {
mProgressBar.setVisibility(View.INVISIBLE);
try {
JSONObject parsedMoviesJSON = new JSONObject(s);
JSONArray moviesArray = parsedMoviesJSON.getJSONArray("results");

mNoOfMovies = moviesArray.length();
moviesArray.getString(1);
for (int i = 0; i < mNoOfMovies; i++) {
MovieDetails mMovDetails = new MovieDetails();
String details = moviesArray.get(i).toString();
JSONObject detailsParsed = new JSONObject(details);
mMovDetails.setMoviePoster("http://image.tmdb.org/t/p/w185/"
+ detailsParsed.getString("poster_path"));
mMovieList.add(mMovDetails);

Log.d(TAG, "onPostExecute: forLoop" + mMovDetails.getMoviePoster());
}
} catch (JSONException e) {
Log.d(TAG, "onPostExecute: error => " + e);
e.printStackTrace();
}
Log.d("TAG", "onPostExecute: movieList" + mMovieList);
mAdapter = new MovieAdapter(mMovieList);
mRecyclerView.setLayoutManager(new GridLayoutManager(MainActivity.this, 2));
mRecyclerView.setAdapter(mAdapter);

Log.d(TAG, "onPostExecute: it's a success " + mNoOfMovies);
}
}
}
}

NetworkUtils 类仅用于打开连接并构建完整的 api URL。我没有将其包含在这里,因为我想让这篇文章尽可能简短。如果您需要什么,请告诉我。提前致谢。

最佳答案

是的,发生这种情况是因为您不断使用相同的列表对象,您必须在 onPostExecute() 中使用它之前创建一个新列表,添加以下内容:

mMovieList = new ArrayList<>();

直接在 for 循环之上,如下所示:

//create a new list for each query
mMovieList = new ArrayList<>();

for (int i = 0; i < mNoOfMovies; i++) {

MovieDetails mMovDetails = new MovieDetails();
String details = moviesArray.get(i).toString();
....
....
....

祝你好运。

关于java - AsyncTask 不刷新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61245197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com