Android 将项目附加到列表视图

Android 将项目附加到列表视图,android,listview,android-listview,Android,Listview,Android Listview,我想将新项目附加到ListView以实现无休止的滚动 private ListAdapter adapter; ArrayList < HashMap < String, String >> listViewList; ... class GetItems extends AsyncTask < String, String, String > { protected String doInBackground(String...args) {

我想将新项目附加到ListView以实现无休止的滚动

private ListAdapter adapter;
ArrayList < HashMap < String, String >> listViewList;

...

class GetItems extends AsyncTask < String, String, String > {

    protected String doInBackground(String...args) {
        ...

        for (int i = 0; i < items.length(); i++) {
            ...
            HashMap < String, String > map = new HashMap < String, String > ();
            map.put("name_1", name_1);
            map.put("name_2", name_3);
            map.put("name_3", name_3);

            listViewList.add(map);
        }
    }

    protected void onPostExecute(String file_url) {
        adapter = new CustomAdapter(Activity.this, listViewList,
            R.layout.single_item, new String[] {}, new int[] {});
        setListAdapter(adapter);
    }
}
私有列表适配器;
ArrayList>listViewList;
...
类GetItems扩展异步任务{
受保护的字符串doInBackground(字符串…args){
...
对于(int i=0;imap=newhashmap();
地图放置(“名称1”,名称1);
地图放置(“名称2”,名称3);
地图放置(“名称3”,名称3);
添加(地图);
}
}
受保护的void onPostExecute(字符串文件\u url){
adapter=新的CustomAdapter(Activity.this、listViewList、,
R.layout.single_项,新字符串[]{},新int[]{});
setListAdapter(适配器);
}
}
GetItems
类根据您提供的页码获取新项目。我想将新项目附加到
onPostExecute
上的现有ListView项目


你知道怎么做吗?

实际上你只需要在
onPostExecute
中调用
适配器.notifyDataSetChanged
。 但您不应该多次实例化适配器。它应该只做一个,这样整体看起来就像这样

private ListAdapter adapter;

...
void onCreate(){ // assuming this is an activity
   adapter = new CustomAdapter(Activity.this, listViewList,
             R.layout.single_item, new String[] {}, new int[] {});
   setListAdapter(adapter);
}

class GetItems extends AsyncTask<String, String, String> {
  ...  

   protected void onPostExecute(String file_url) {
     adapter.notifyDataSetChanged();
   }
}
私有列表适配器;
...
void onCreate(){//假设这是一个活动
adapter=新的CustomAdapter(Activity.this、listViewList、,
R.layout.single_项,新字符串[]{},新int[]{});
setListAdapter(适配器);
}
类GetItems扩展异步任务{
...  
受保护的void onPostExecute(字符串文件\u url){
adapter.notifyDataSetChanged();
}
}

在GitHub上查看此库

根据您的评论进行编辑:

您需要忘记
ListActivity
,如果您听说它存在,那么它对您正在尝试的操作是无用的

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;



public class DemosAdapter extends BaseAdapter {

    public List<DemoItem> listOfItems;
    private View v;
    private ViewWrapper wrapper;
    private Context context;

    public DemosAdapter(Context c, List<DemoItem> listOfItems) {
        this.context = c;
        this.listOfItems = listOfItems;
    }

    @Override
    public int getCount() {
        return listOfItems.size();
    }

    @Override
    public DemoItem getItem(int i) {
        return listOfItems.get(i);
    }

    @Override
    public long getItemId(int i) {
        return 0;
    }

    public void sort() {
        Collections.sort(listOfItems, new Comparator<DemoItem>() {
            @Override
            public int compare(DemoItem item, DemoItem item2) {
                return item.getName().compareTo(item2.getName());
            }
        });
    }

    public void addItems(List<DemoItem> listOfFreshItems){
        listOfItems.addAll(listOfFreshItems);
        notifyDataSetChanged();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        DemoItem itm = listOfItems.get(position);

        v = convertView;

        if (v == null) {
            LayoutInflater inflater = LayoutInflater.from(context);
            v = inflater.inflate(R.layout.demo_item, null, false);
            wrapper = new ViewWrapper(v);
            v.setTag(wrapper);
        }
        else {
            wrapper = (ViewWrapper) v.getTag();
        }

        wrapper.getTvDemoName().setText(itm.getName());

        return v;
    }

    private class ViewWrapper {

        private View base;
        private TextView tvDemoName;

        public ViewWrapper(View v) {
            this.base = v;
        }

        public TextView getTvDemoName() {
            if (tvDemoName == null) {
                tvDemoName = (TextView) base.findViewById(R.id.tvDemoName);
            }
            return tvDemoName;
        }

    }
}
当你收到新的物品时,打电话就可以了

adapter.addItems(List<DemoItem> newItems);
adapter.addItems(列出新项);

适配器没有notifyDataSetChanged(),只有notify()和notifyAll()。没有,因为ListAdapter只是一个接口。实现取决于您的CustomAdapter。虽然从技术上讲,您可以向列表中添加与适配器关联的项,但如果没有上述实现,更改将不可能生效。我已经看到了它,但它没有显示如何向适配器添加新的数据项。我添加了一些演示代码。你需要根据需要修改它,但你会看到这个想法。
adapter.addItems(List<DemoItem> newItems);