gpt4 book ai didi

java - 无法使用 asynctask 获取自定义列表适配器来填充 ListView

转载 作者:行者123 更新时间:2023-12-01 09:30:50 25 4
gpt4 key购买 nike

我正在尝试填充对象的 ArrayList 并使用这些对象填充 ListView。我的 Asynctask 可以获取 json 数据,我可以解析它并生成我需要的对象,但我的 ListView 不会填充。当我在适配器运行之前检查 ArrayList 中是否有任何对象时,我发现它没有。我想知道为什么我的 ListView 没有填充。

这是我的代码:(抱歉,如果它很乱,有些地方我还没有更新)

public class MovieDisplayFragment extends Fragment{

private ArrayList<Movie> movieList = new ArrayList<Movie>();
private MovieAdapter movieAdapter;
ListView listView;

public MovieDisplayFragment(){
}

@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View rootView = inflater.inflate(R.layout.fragment_main, container, false);

movieAdapter = new MovieAdapter(getActivity(), movieList);
listView = (ListView) rootView.findViewById(R.id.listview_data);
listView.setAdapter(movieAdapter);

if(movieList.size() > 0) {
Log.e("Hello", "1");
}

listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l){
Movie movie = movieAdapter.getItem(position);
Intent i = new Intent(getActivity(), DetailActivity.class)
.putExtra(Intent.EXTRA_TEXT, "Hello");
startActivity(i);
}
});

return rootView;
}

private void updateMovieData(){
getMovieData movieData = new getMovieData();
movieData.execute();
}

@Override
public void onStart(){
super.onStart();
updateMovieData();
}

public class getMovieData extends AsyncTask<Void, Void, List<Movie>> {

private final String LOG_CAT = getMovieData.class.getSimpleName();

private List<Movie> getMovieData(String movieJsonStr) throws JSONException {

final String MOV_ITEMS = "results";
final String MOV_TITLE = "original_title";
final String MOV_DATE = "release_date";
final String MOV_SYNOPSIS = "overview";
final String MOV_VOTE = "vote_average";
final String MOV_POSTER_URL = "poster_path";

JSONObject movieJson = new JSONObject(movieJsonStr);
JSONArray movieArray = movieJson.getJSONArray(MOV_ITEMS);

Log.e("Hello", "2");

for (int i = 0; i < movieArray.length(); i++) {

JSONObject movie = movieArray.getJSONObject(i);

movieList.add(new Movie(movie.getString(MOV_TITLE), movie.getString(MOV_DATE),
movie.getString(MOV_SYNOPSIS), movie.getString(MOV_VOTE), movie.getString(MOV_POSTER_URL)));

}

return movieList;
}

protected List<Movie> doInBackground(Void... params) {

HttpURLConnection urlConnection = null;
BufferedReader reader = null;

String movieJsonStr = null;

try {

final String BASE_URL = "http://api.themoviedb.org/3/genre/10751/movies?api_key=358f3b44734f7e6404f2d01a62d3c176&include_all_movies=true&include_adult=true";
Uri builtUri = Uri.parse(BASE_URL).buildUpon().build();
URL url = new URL(builtUri.toString());

Log.v(LOG_CAT, "Built URI " + builtUri.toString());

urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();

InputStream inputStream = urlConnection.getInputStream();
StringBuffer buffer = new StringBuffer();
if (inputStream == null){
movieJsonStr = null;
}
reader = new BufferedReader(new InputStreamReader(inputStream));

String line;
while((line = reader.readLine()) != null){
buffer.append(line + "\n");
}

if (buffer.length() == 0){
movieJsonStr = buffer.toString();
}
movieJsonStr = buffer.toString();

Log.v(LOG_CAT, "Movie String: " + movieJsonStr);
} catch (IOException e) {
Log.e("Fragment", "Error", e);
movieJsonStr = null;

} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
if (reader != null) {
try {
reader.close();
} catch (final IOException e) {
Log.e("PlaceholderFragment", "Error closing stream", e);
}
}
}

try {
return getMovieData(movieJsonStr);
} catch (JSONException e) {
Log.e(LOG_CAT, e.getMessage(), e);
e.printStackTrace();
}
return null;
}

@Override
protected void onPostExecute(List<Movie> movies){
if(movies != null){
movieAdapter.clear();
for(Movie movieData : movies){
movieAdapter.add(movieData);
}
}
}
}

}

最佳答案

将这两行放在异步的 onPostExecute() 中。

movieAdapter = new MovieAdapter(getActivity(), movieList);
listView.setAdapter(movieAdapter);

AsyncTask 在后台线程中运行。几秒钟后它从 json 获取数据。但是您的适配器在创建 fragment 后几毫秒内被调用。

因此,当您设置适配器时,Json 中的数据将不存在。

在onPostExecute中调用它可以解决这个问题,因为adatpter是在从服务器检索Json数据后设置的!

希望对大家有一点帮助。

关于java - 无法使用 asynctask 获取自定义列表适配器来填充 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39417978/

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