没有调用自定义ArrayAdapter的getView

时间:2016-01-21 12:13:53

标签: java android android-arrayadapter custom-adapter

类似的问题 Custom adapter getview is not called

我有一个自定义适配器可以将图像放在我的应用程序屏幕上,但它根本没有被调用。做一些研究我发现我需要覆盖getCount()方法。我已经完成了返回ArrayList的大小,但仍然没有运气。我认为列表可能是空的,但是通过调试,我可以确认它不是在传递给自定义ArrayAdapter类时。我甚至尝试在getCount()中返回值20以查看是否可行,但仍然没有运气。

这是我到目前为止所做的代码;

MainActivityFragment.class

public class MainActivityFragment extends Fragment {
    private ImageAdapter imageAdapter;

    public class FetchMovieTask extends AsyncTask<String, Void, JSONObject> {
        @Override
        protected void onPostExecute(JSONObject strings) {


            Log.i(LOG_TAG, strings.toString());

            try {
                jsonArray = strings.getJSONArray("results");


            if (null != jsonArray) {

                ArrayList<JSONObject> list = new ArrayList<JSONObject>();

                if (jsonArray != null) {
                    int len = jsonArray.length();
                    for (int i=0;i<len;i++){
                        list.add((JSONObject) jsonArray.get(i));
                    }
                }

                imageAdapter = new ImageAdapter(getActivity(), list);
            }

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }
}
  • 这个片段类还有很多,但是我只是包含了从doInBackground()返回JSONObject的地方,并且在onPostExecute()中我从JSONObject中提取了一个JSONArray并将来自JSONArray的每个元素放入ArrayList<JSONObject>并将其发送到我的自定义ArrayAdapter类

ImageAdapter.class

public class ImageAdapter extends ArrayAdapter<ArrayList> {

ArrayList list;
Context context;

public ImageAdapter(Context context, ArrayList list) {
    super(context, android.R.id.content);
    this.list = list;
    this.context = context;
}


@Override
public int getCount() {
    //return list.size();
    return 20;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    String IMAGE_BASE_URL = "http://image.tmdb.org/t/p/w185/";

    try {
        JSONObject jsonObject = (JSONObject) list.get(position);

        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.list_image_movie, parent, false);
        }

        ImageView iv = (ImageView) convertView.findViewById(R.id.list_movie_pics_imageview);

        Picasso.with(context)
                .load(IMAGE_BASE_URL + jsonObject.get("poster_path"))
                .into(iv);

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

    return convertView;
}

}
  • getCount已设置为list.size()值,其中列表不为null且仍未调用
  • 它被硬编码为20(列表的大小),但仍然没有被称为

有任何想法如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

在初始化Adapter后,将其设置为ListView

public class MainActivityFragment extends Fragment {

private ImageAdapter imageAdapter;

public class FetchMovieTask extends AsyncTask<String, Void, JSONObject> {
    @Override
    protected void onPostExecute(JSONObject strings) {


        Log.i(LOG_TAG, strings.toString());

        try {
            jsonArray = strings.getJSONArray("results");


        if (null != jsonArray) {

            ArrayList<JSONObject> list = new ArrayList<JSONObject>();

            if (jsonArray != null) {
                int len = jsonArray.length();
                for (int i=0;i<len;i++){
                    list.add((JSONObject) jsonArray.get(i));
                }
            }

            imageAdapter = new ImageAdapter(getActivity(), list);
            yourListView.setAdapter(imageAdapter);
        }

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

答案 1 :(得分:0)

创建此内容后,您必须致电imageAdapter.notifyDataSetChanged()。这将通知适配器调用getView()

<强>更新 在listView上设置适配器,然后在notifyDataSetChanged

上设置

yourListView.setAdapter(imageAdapter); imageAdapter.notifyDataSetChanged()

答案 2 :(得分:0)

根据您的评论,我可以看到您正在使用listview方法将适配器分配给onCreateView。那时你的适配器还没准备好。因此,您需要在向其添加数据后刷新适配器。

添加

imageAdapter.notifyDataSetChanged();

之后

imageAdapter = new ImageAdapter(getActivity(), list);

onPostExecute方法中。