Android 我的ListView正在更新但未删除以前的项目

Android 我的ListView正在更新但未删除以前的项目,android,android-listview,android-asynctask,Android,Android Listview,Android Asynctask,我正在使用CustomAdapter扩展BaseAdapter和asynctask以在列表视图中显示结果。一切正常,但我希望每10分钟用新项目刷新列表视图,因此我将AsyncTask放在TimeTask中。问题是,listview并没有删除它的旧项,而是用旧项附加新项。我使用notifyDataSetChanged()和我在互联网上找到的所有东西,但什么也没发生。这是我的代码: public class Twitter7FeedActivity extends Activity { L

我正在使用
CustomAdapter
扩展
BaseAdapter
asynctask
以在
列表视图中显示结果。一切正常,但我希望每10分钟用新项目刷新列表视图,因此我将
AsyncTask
放在
TimeTask
中。问题是,
listview
并没有删除它的旧项,而是用旧项附加新项。我使用
notifyDataSetChanged()
和我在互联网上找到的所有东西,但什么也没发生。这是我的代码:

public class Twitter7FeedActivity extends Activity {

    LazyAdapter adapter;
    ListView list;

    JSONObject jsonObj = null;
    JSONArray jsonArray = null;
    ArrayList<HashMap<String, String>> tweets = new ArrayList<HashMap<String, String>>();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_twitter7_feed);
        callAsynchronousTask();
    }

    public void callAsynchronousTask() {
        final Handler handler = new Handler();
        Timer timer = new Timer();
        TimerTask doAsynchronousTask = new TimerTask() {
            @Override
            public void run() {
                handler.post(new Runnable() {
                    public void run() {
                        try {
                            new GetFeedTask().execute(CommonUtils.BEARER_TOKEN,
                                    CommonUtils.URL);
                        } catch (Exception e) {
                        }
                    }
                });
            }
        };
        timer.schedule(doAsynchronousTask, 0, 30000);
    }

    protected class GetFeedTask extends AsyncTask<String, Void, String> {


        @Override
        protected String doInBackground(String... params) {
               //related code
        }

        @Override
        protected void onPostExecute(String jsonText) {

            // My Json parsing related code

            list = (ListView) findViewById(R.id.list);
            adapter = new LazyAdapter(Twitter7FeedActivity.this, tweets);
            list.setAdapter(adapter);
            //adapter.notifyDataSetChanged();
            ((LazyAdapter) list.getAdapter()).notifyDataSetChanged();
        }
    }
}
公共类Twitter7FeedActivity扩展活动{
懒散适配器;
列表视图列表;
JSONObject jsonObj=null;
JSONArray JSONArray=null;
ArrayList tweets=新建ArrayList();
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.layout\u twitter7\u提要);
callAsynchronousTask();
}
public void callAsynchronousTask(){
最终处理程序=新处理程序();
定时器=新定时器();
TimerTask doAsynchronousTask=新TimerTask(){
@凌驾
公开募捐{
handler.post(新的Runnable(){
公开募捐{
试一试{
新建GetFeedTask().execute(CommonUtils.BEARER_令牌,
CommonUtils.URL);
}捕获(例外e){
}
}
});
}
};
timer.schedule(doAsynchronousTask,0,30000);
}
受保护的类GetFeedTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…参数){
//相关代码
}
@凌驾
受保护的void onPostExecute(字符串jsonText){
//我的Json解析相关代码
list=(ListView)findViewById(R.id.list);
adapter=新的LazyAdapter(Twitter7FeedActivity.this,tweets);
list.setAdapter(适配器);
//adapter.notifyDataSetChanged();
((LazyAdapter)list.getAdapter()).notifyDataSetChanged();
}
}
}
这是我的LazyAdapter类:

public class LazyAdapter extends BaseAdapter {

    private Activity activity;
    private ArrayList<HashMap<String, String>> data;
    private static LayoutInflater inflater = null;
    public ImageLoader imageLoader;

    public LazyAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
        activity = a;
        data = d;
        notifyDataSetChanged(); // I am also using it here
        inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader = new ImageLoader(activity.getApplicationContext());
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        if (convertView == null)
            vi = inflater.inflate(R.layout.list_row, null);
        TextView name = (TextView) vi.findViewById(R.id.name);
        TextView tweet = (TextView) vi.findViewById(R.id.text);
        TextView date = (TextView) vi.findViewById(R.id.created_at);

        //related code

        return vi;
    }
}
公共类LazyAdapter扩展了BaseAdapter{
私人活动;
私有数组列表数据;
专用静态充气机=空;
公共图像加载器;
公共LazyAdapter(活动a,ArrayList d){
活动=a;
数据=d;
notifyDataSetChanged();//我也在这里使用它
充气器=(充气器)活动
.getSystemService(上下文布局\充气机\服务);
imageLoader=新的imageLoader(activity.getApplicationContext());
}
公共视图getView(int位置、视图转换视图、视图组父视图){
视图vi=转换视图;
if(convertView==null)
vi=充气机充气(R.layout.list_行,空);
TextView name=(TextView)vi.findViewById(R.id.name);
TextView tweet=(TextView)vi.findviewbyd(R.id.text);
TextView日期=(TextView)vi.findViewById(R.id.created_at);
//相关代码
返回vi;
}
}

再次运行AsyncTask后,listview会在末尾追加新项目,但我需要仅使用新项目完全刷新listview。

在将新项目放入listview之前,首先需要清除listview中已经存在的项目

例如:

    clearButton.setOnClickListener(new OnClickListener()
    {

        public void onClick(View arg0)
        {
            adapter.clear();
            adapter.notifyDataSetChanged();
        }
    });
}

在将新项目放入ListView之前,首先需要清除ListView中已有的项目

例如:

    clearButton.setOnClickListener(new OnClickListener()
    {

        public void onClick(View arg0)
        {
            adapter.clear();
            adapter.notifyDataSetChanged();
        }
    });
}

由于较少的声誉,我给你答案,否则可以在评论中给出


使用
adapter.notifyDataSetChanged()当您完成后台任务或更新数据时。

由于声誉较低,我会给您答案,否则可以在评论中给出答案


使用
adapter.notifyDataSetChanged()当您完成后台任务或更新数据时。

这是一个自定义适配器。
clear()
函数的代码应该是什么?在代码的哪一部分清除数据?也许这可以帮助您:这是一个自定义适配器。
clear()
函数的代码应该是什么?在代码的哪一部分清除数据?也许这对你有帮助:我已经设置好了。(请参阅我的代码)。但是它在listview中添加了新的项目,而不是删除以前的项目。我已经设置了它。(请参阅我的代码)。但它是在listview上追加新项目,而不是删除以前的项目。