java - 更改自定义适配器内容

标签 java android android-fragments android-asynctask

我试图将从 Web 服务获取的数据放入自定义适配器中以显示在我的网格中,问题是下载需要一些时间才能在异步调用中完成,因此当我尝试将适配器设置为数组时数据(在本例中为电影)为空。

这是我的 Activity :

package com.movieposter;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.GridView;

import com.squareup.okhttp.Call;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;

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

import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    private final String API = "***";
    private Movie[] movies;
    private GridView grid;
    private ImageAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        grid = (GridView) findViewById(R.id.grid_view);
        getMovies();
        ImageAdapter adapter = new ImageAdapter(this, movies);
        grid.setAdapter(adapter);


    }

    public void getMovies(){
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url("http://api.themoviedb.org/3/discover/movie?sort_by=popularity.desc&api_key=**")
                .build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {

            }

            @Override
            public void onResponse(Response response) throws IOException {
                String json = response.body().string();
                if (response.isSuccessful()) {
                    try {
                        Log.i("teste", response.body().string());
                        movies = parseMovie(json);



                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }

    private Movie[] parseMovie(String json) throws JSONException {
        JSONObject jsonMovie = new JSONObject(json);
        JSONArray data = jsonMovie.getJSONArray("results");
        Movie[] movies = new Movie[data.length()];

        for(int i = 0; i < data.length(); i++ ){
            JSONObject jsonObject = data.getJSONObject(i);
            Movie movie = new Movie();
            movie.setOverview(jsonObject.getString("overview"));
            movie.setRating(jsonObject.getDouble("vote_average"));
            movie.setReleaseDate(jsonObject.getString("release_date"));
            movie.setTitle(jsonObject.getString("title"));
            movie.setThumbnail("http://image.tmdb.org/t/p/w185/" + jsonObject.getString("poster_path"));
            movies[i] = movie;
        }
        return movies;
    }



}

还有我的适配器

package com.movieposter;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

import com.squareup.picasso.Picasso;

public class ImageAdapter extends BaseAdapter {
    private Context mContext;
    Movie[] movies;

    public ImageAdapter(Context c, Movie[] movies) {
        mContext = c;
        this.movies = movies;
    }

    public int getCount() {
        return movies.length;
    }

    public Object getItem(int position) {
        return movies[position];
    }

    public long getItemId(int position) {
        return 0;
    }

    // create a new ImageView for each item referenced by the Adapter
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) {
            // if it's not recycled, initialize some attributes
            imageView = new ImageView(mContext);
            imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(8, 8, 8, 8);
        } else {
            imageView = (ImageView) convertView;
        }

        Picasso.with(mContext).load(movies[position].getThumbnail()).into(imageView);
        return imageView;
    }

}

我尝试在 onResponse 方法中设置适配器,但这不起作用,如果您不知道数据何时完成,将数据从 Web 服务加载到您的适配器的最佳方法是什么?是否可以设置一个空适配器,然后在数据准备好后替换内容?是这样,怎么样?

最佳答案

您必须使用列表而不是数组来存储对象。因为数据结构应该是动态的(你永远不知道有多少部电影......)。

List<Movie> movies = new ArrayList<Movie>();// First keep this empty.

那么,

if (response.isSuccessful()) {
    try {
        Log.i("teste", response.body().string());
        movies.clear();// Do not re assign 
        movies.addAll(parseMovie(json)); // just clear and add new movies
        adapter.notifyDataSetChanged(); //add this

    } catch (Exception e) {
        e.printStackTrace();
    }
}

关于java - 更改自定义适配器内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33158457/

相关文章:

java - SQL数据库错误: Table has no column name

android - 使用 Parceler 保存 Android Activity 或 Fragment 状态

java - 如何让 EditText view 在 Presentation(Duel Screen) 中获得焦点和 SoftKeyboard 输入?

java - 如何将复杂的map嵌套列表转换为json对象

未检查 Android Activity 结果

java - 构建数据结构解析文本文件java

java - Android:仅在应用程序启动时运行

java - 代码中惊人的错误

java - 我如何从 LatLng 获得邻居

java - postgresql中如何表示小数字?