我正在使用自定义cwac-endless
的{{1}} EndlessAdapter
。使用AsyncTask,我分两个阶段获取网络服务器的数据表格。
1)我得到了所有元素的id
2)使用EndlessAdapter我想一次加载4个元素(我从他们的id获取服务器4个元素)
我面临的问题是,当我调用MyEndlessAdapter的构造函数创建我的ListViewAdapter
时,它会创建带有第一个bach项的项目列表。当我加载下一批元素我的自定义custom ListViewAdapter
它从服务器获取正确的项目,但我回收getView(图形/视觉的东西)。我究竟做错了什么!
我认为可能的解决方案是使用ListViewAdapter
的{{1}}方法,但我不知道如何从add
类调用它。
我该如何解决这个问题? 感谢
ListViewAdapter代码:
CustomListView
CompraFragment代码:
CompraFragment
ItemView代码:
public class ListViewAdapter extends ArrayAdapter<Item> {
private LayoutInflater inflater = null;
private final String TAG = "ListViewAdapter";
public Context context;
public int layoutResourceId;
public ArrayList<Item> items;
public ListViewAdapter(Context context, int listviewItemRow, ArrayList<Item> items) {
// TODO Auto-generated constructor stub
super(context, listviewItemRow);
this.context = context;
this.items = items;
}
public ListViewAdapter(Context context, int listviewItemRow) {
super(context, listviewItemRow);
this.context = context;
}
@Override
public void add(Item object) {
Log.i(TAG, "---ADD---");
items.add(object);
//super.add(object);
}
@Override
public void clear() {
super.clear();
}
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
}
@Override
public void remove(Item object) {
super.remove(object);
}
@Override
public int getCount() {
return items.size();
}
public Item getItem(Item position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
Item item = items.get(position);
Log.w(TAG, "view of Item " + item.getId() + " at position " + position);
ItemView view;
if (convertView == null) {
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = (ItemView) inflater.inflate(R.layout.listview_item_row, null);
view.checkFollowing(item, this, 3);
view.setTag(Long.toString(item.getId()));
Log.e(TAG, "CREATED ITEM " + item.getId() + " at position " + position);
} else {
view = (ItemView) convertView;
Log.i(TAG, "RECYCLED ITEM " + item.getId() + " at position " + position);
}
view.setOnClickListener(new OnItemClickListener(position));
view.showItems(item);
return view;
}
private class OnItemClickListener implements OnClickListener {
private int mPosition;
private OnItemClickListener(int position){
mPosition = position;
}
@Override
public void onClick(View v) {
Toast.makeText(context, "Message " + Integer.toString(mPosition), Toast.LENGTH_SHORT).show();
Intent intent = new Intent(context, DettagliActivity.class);
Bundle bundle = new Bundle();
bundle.putInt("id", mPosition);
intent.putExtras(bundle);
context.startActivity(intent);
}
}
}
答案 0 :(得分:1)
当视图被回收[即作为非空getView()
传递给convertView
]时,您需要更新它以反映当前item
的状态。因此,需要在if / then块之后移动下面指出的2行。
public View getView(final int position, View convertView, ViewGroup parent) {
Item item = items.get(position);
Log.w(TAG, "view of Item " + item.getId() + " at position " + position);
ItemView view;
if (convertView == null) {
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = (ItemView) inflater.inflate(R.layout.listview_item_row, null);
Log.e(TAG, "CREATED ITEM " + item.getId() + " at position " + position);
} else {
view = (ItemView) convertView;
Log.i(TAG, "RECYCLED ITEM " + item.getId() + " at position " + position);
}
// ===> These 2 lines always need to be executed. <===
view.checkFollowing(item, this, 3);
view.setTag(Long.toString(item.getId()));
view.setOnClickListener(new OnItemClickListener(position));
view.showItems(item);
return view;
}