【问题标题】:Android Refresh ListView by ArrayAdapterAndroid 通过 ArrayAdapter 刷新 ListView
【发布时间】:2014-09-17 14:53:01
【问题描述】:

在我的应用程序的简单 ListView 中,我想在向下滚动完成时添加列表末尾的项目并刷新它。我的代码只能将数据传递到 ListView 中,而不能添加到列表末尾并刷新它。请帮我解决这个问题。谢谢。

private ItemAdapter adapter;

public class ReceivedFragment extends ListFragment implements AbsListView.OnScrollListener {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        items = new ArrayList<Item>();

        for ( int i=0; i<=10; i++){
             String a = String.format("title %s", i);
             String b = String.format("description %s", i);
             Item item = new Item(a , b , String.valueOf(i) );
             items.add(item);
        }
        adapter = new ItemAdapter(getActivity(), items);
        setListAdapter(adapter);
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
     if (prevVisibleItem != firstVisibleItem) {
        if ((firstVisibleItem + visibleItemCount) == totalItemCount) {

            Toast.makeText(getActivity(), R.string.please_wait_to_response_from_server, Toast.LENGTH_LONG).show();

            Thread thread = new Thread() {
                @Override
                public void run() {
                    getActivity().runOnUiThread(new Runnable() {
                        public void run() {
                            for (int i = (int) getLastID(); i <= getLastID() + 10; i++) {
                                String a = String.format("title %s", i);
                                String b = String.format("description %s", i);
                                Item item = new Item(a, b, String.valueOf(i));
                                items.add(item);
                            }
                            adapter.notifyDataSetChanged();
                        }
                    });
                }
            };
        }
    }
}

    @Override
    public void onListItemClick(ListView l, View v, int position, long thisID) {
        super.onListItemClick(l, v, position, thisID);
    }
    public long getLastID() {
        return Long.parseLong(items.get(items.size() - 1).getmLastID());
    }
}

阵列适配器:

public class ItemAdapter extends ArrayAdapter<Item> {

    public ItemAdapter(Context c, List<Item> items) {
        super(c,0,items);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ItemView itemView = (ItemView)convertView;
        if (null == itemView)
            itemView = ItemView.inflate(parent);

        itemView.setItem(getItem(position));

        itemView.setBackgroundColor(((position % 2)!=0) ? Color.rgb(229, 229, 229) : Color.WHITE);
        return itemView;
    }

}

【问题讨论】:

    标签: android listview android-listview android-arrayadapter


    【解决方案1】:
        ArrayAdapter adapter = (ArrayAdapter)yourListView.getAdapter();
    
      ArrayList<Item>  items = new ArrayList<Item>();
                     for ( int i= (int) getLastID(); i<= getLastID() + 10; i++){
    
                String a = String.format("title %s", i);
                String b = String.format("description %s", i);
    
                        Item item = new Item(a , b , String.valueOf(i) );
                        items.add(item);
    
                    }
            adapter.addAll(items);
            adapter.notifyDataSetChanged();
    

    【讨论】:

    • 如果您的方法在列表末尾被调用,请在 onScroll 中的 if 条件中尝试此代码
    • 我想他会从异步任务中加载数据,这就是我添加 uithread 代码的原因。谢谢mmlooloo 我刚刚编辑了代码
    • @mmlooloo 发布已更新。我的问题不是runOnUiThread 我的代码没有它无法正常添加和刷新ListView
    • @andbee 你仍然缺少这部分:adapter.addAll(items); mmlooloo 是对的,我们这里不需要 runOnUiThread
    • @NavinRaj Pandey 这很简单,我需要使用它。删除并移出Thread 后,我的问题没有解决。我测试了
    【解决方案2】:

    要为您的ListView 加载新行,您应该在列表更改后调用setAdapter

    而不是:

    new ItemAdapter(getActivity(), items).notifyDataSetChanged();
    

    我会试试的

    my_listview.setAdapter(new ItemAdapter(getActivity(), items); //items must contains the old and the new items
    

    或者只是

    setAdapter(new ItemAdapter(getActivity(), items); 
    

    当您使用 ListFragment 时。您可能还需要致电notifyDataSetChanged(),但我不完全确定

    【讨论】:

    • 不需要每次都创建新的适配器,浪费内存,一次又一次地运行GC。
    猜你喜欢
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多