EndlessAdapter未正确添加项目到自定义ListView

时间:2014-04-18 10:01:50

标签: android android-custom-view cwac-endless

我正在使用自定义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);
        }   
    }

}

1 个答案:

答案 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;
}