奇怪...ListView 只显示部分数据
Strange... ListView is showing just part of the data
所以...我有包含 ListView 的 Fragment。
我也有 private ArrayList<ComicListItem> listViewData;
是在片段 class 中定义的。在该列表中,我存储数据以使用 ListView 显示它。
我也有public class ListViewOfComicsAdapter extends ArrayAdapter<ComicListItem>
我用里面的数据填充 listViewData
@Override
public void setUserVisibleHint(boolean isVisibleToUser)
并且数据在那里,我通过调试器看到了。
接下来我要做的事:
@Override
public void onResume()
{
super.onResume();
ArrayList<ComicListItem> itemArrayList = new ArrayList<>();
if(listViewData != null)
{
for (ComicListItem cli : listViewData)
itemArrayList.add(cli);
}
// I added this one for test, and it is the only one that is shown inside ListView
itemArrayList.add(new ComicListItem(true, "aaaa", null, "eeee"));
listView = (ListView)getActivity().findViewById(R.id.list_view_comics);
adapter = new ListViewOfComicsAdapter(getContext(), R.id.list_view_comics, itemArrayList);
// adapter.notifyDataSetChanged(); // no change, really
listView.setAdapter(adapter);
}
我正在将值一一复制到其他 ArrayList<ComicListItem>
。为什么?因为我之前在将 listViewData
传递给 ListViewOfComicsAdapter
的构造函数时遇到了同样的问题,所以我只是像这样在 itemArrayList
中复制了数据,并且工作了很短的时间(数据可见).
现在,唯一可见的项目是我手动添加的项目(用于测试目的)。在调试器中,我在 itemArrayList
中看到 31 项,它们不为空。
我添加到 listViewData
的所有数据都存在,但在 ListView 中不可见。
getView(int position, View convertView, ViewGroup parent)
来自适配器只被调用一次。
我有 list_view_item.xml
并且显示的列表项正在使用它。
我很痛苦,请帮助。
更新 - 适配器代码
public class ListViewOfComicsAdapter extends ArrayAdapter<ComicListItem>
{
Context mContext;
ComicListItem data[] = null;
public ListViewOfComicsAdapter(Context context, int resource, ArrayList<ComicListItem> items)
{
super(context, resource, items);
mContext = context;
try
{
data = new ComicListItem[items.size()];
for (int i = 0; i < items.size(); i++)
data[i] = items.get(i);
}
catch (Exception e)
{
Log.e("problem", "no items to display in framgent");
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
boolean recycleView = true;
if(convertView == null)
{
// inflate the layout
LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
convertView = inflater.inflate(R.layout.list_item_comic, parent, false);
recycleView = false;
}
// object item based on the position
ComicListItem objectItem = data[position];
ComicStorageInfo info = new ComicStorageInfo(null, 0, position + 1, 1, objectItem.fileName);
TextView textViewItem = (TextView) convertView.findViewById(R.id.list_item_comic);
textViewItem.setText(objectItem.date);
if(!recycleView)
{
Drawable drawable = new BitmapDrawable(getContext().getResources(), App.getInstance().readImageFromInternalStorage(info.getFileName()));
textViewItem.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null);
}
else
{
ProgressBar progressBar = (ProgressBar)convertView.findViewById(R.id.comic_progressbar);
new ReadImageFromStorage(textViewItem, progressBar).execute(info.getFileName());
}
return convertView;
}
}
问题是我有 2 个片段,第二个片段的 OnResume()
在之后被调用,它覆盖第一个片段。并且它们具有相同的 ID,因此它始终写入第一个片段。够糊涂了。
所以...我有包含 ListView 的 Fragment。
我也有 private ArrayList<ComicListItem> listViewData;
是在片段 class 中定义的。在该列表中,我存储数据以使用 ListView 显示它。
我也有public class ListViewOfComicsAdapter extends ArrayAdapter<ComicListItem>
我用里面的数据填充 listViewData
@Override
public void setUserVisibleHint(boolean isVisibleToUser)
并且数据在那里,我通过调试器看到了。
接下来我要做的事:
@Override
public void onResume()
{
super.onResume();
ArrayList<ComicListItem> itemArrayList = new ArrayList<>();
if(listViewData != null)
{
for (ComicListItem cli : listViewData)
itemArrayList.add(cli);
}
// I added this one for test, and it is the only one that is shown inside ListView
itemArrayList.add(new ComicListItem(true, "aaaa", null, "eeee"));
listView = (ListView)getActivity().findViewById(R.id.list_view_comics);
adapter = new ListViewOfComicsAdapter(getContext(), R.id.list_view_comics, itemArrayList);
// adapter.notifyDataSetChanged(); // no change, really
listView.setAdapter(adapter);
}
我正在将值一一复制到其他 ArrayList<ComicListItem>
。为什么?因为我之前在将 listViewData
传递给 ListViewOfComicsAdapter
的构造函数时遇到了同样的问题,所以我只是像这样在 itemArrayList
中复制了数据,并且工作了很短的时间(数据可见).
现在,唯一可见的项目是我手动添加的项目(用于测试目的)。在调试器中,我在 itemArrayList
中看到 31 项,它们不为空。
我添加到 listViewData
的所有数据都存在,但在 ListView 中不可见。
getView(int position, View convertView, ViewGroup parent)
来自适配器只被调用一次。
我有 list_view_item.xml
并且显示的列表项正在使用它。
我很痛苦,请帮助。
更新 - 适配器代码
public class ListViewOfComicsAdapter extends ArrayAdapter<ComicListItem>
{
Context mContext;
ComicListItem data[] = null;
public ListViewOfComicsAdapter(Context context, int resource, ArrayList<ComicListItem> items)
{
super(context, resource, items);
mContext = context;
try
{
data = new ComicListItem[items.size()];
for (int i = 0; i < items.size(); i++)
data[i] = items.get(i);
}
catch (Exception e)
{
Log.e("problem", "no items to display in framgent");
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
boolean recycleView = true;
if(convertView == null)
{
// inflate the layout
LayoutInflater inflater = ((Activity) mContext).getLayoutInflater();
convertView = inflater.inflate(R.layout.list_item_comic, parent, false);
recycleView = false;
}
// object item based on the position
ComicListItem objectItem = data[position];
ComicStorageInfo info = new ComicStorageInfo(null, 0, position + 1, 1, objectItem.fileName);
TextView textViewItem = (TextView) convertView.findViewById(R.id.list_item_comic);
textViewItem.setText(objectItem.date);
if(!recycleView)
{
Drawable drawable = new BitmapDrawable(getContext().getResources(), App.getInstance().readImageFromInternalStorage(info.getFileName()));
textViewItem.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null);
}
else
{
ProgressBar progressBar = (ProgressBar)convertView.findViewById(R.id.comic_progressbar);
new ReadImageFromStorage(textViewItem, progressBar).execute(info.getFileName());
}
return convertView;
}
}
问题是我有 2 个片段,第二个片段的 OnResume()
在之后被调用,它覆盖第一个片段。并且它们具有相同的 ID,因此它始终写入第一个片段。够糊涂了。