类似的问题 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;
}
}
list.size()
值,其中列表不为null且仍未调用有任何想法如何解决这个问题?
答案 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
方法中。