Android ListView OnScrollListener清除旧数据

时间:2012-07-25 18:31:57

标签: java android listview

我使用LazyAdapter创建了一个列表视图。

当我滚动到列表底部时,新数据会显示,但它会清除所有旧数据。

如何在旧数据下附加新数据?

这是我的主要活动代码

import java.util.ArrayList;
import java.util.HashMap;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.w3c.dom.NodeList;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.sax.Element;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;

public class AndroidJSONParsingActivity extends Activity {

    // url to make request


    // JSON Node names
    static final String TAG_CONTACTS = "comics";
    static final String TAG_ID = "id";
    static final String TAG_NAME = "title";
    static final String TAG_EMAIL = "id";
    static final String TAG_PHONE_MOBILE = "image";

    // contacts JSONArray
    JSONArray contacts = null;
    ListView list;
    LazyAdapter adapter;
    static int counter = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

                        // call the function
                LoadData();




    }

    public void LoadData(){
        String url = "http://myurl.com/?start=" + counter;
        // Hashmap for ListView
                ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();

                // Creating JSON Parser instance
                JSONParser jParser = new JSONParser();

                // getting JSON string from URL
                JSONObject json = jParser.getJSONFromUrl(url);

                try {
                    // Getting Array of Contacts
                    contacts = json.getJSONArray(TAG_CONTACTS);

                    // looping through All Contacts
                    for(int i = 0; i < contacts.length(); i++){
                        JSONObject c = contacts.getJSONObject(i);

                        // Storing each json item in variable
                        String id = c.getString(TAG_ID);
                        String name = c.getString(TAG_NAME);
                        String email = c.getString(TAG_EMAIL);
                        String mobile = c.getString(TAG_PHONE_MOBILE);
                        // Phone number is agin JSON Object

                        // creating new HashMap
                        HashMap<String, String> map = new HashMap<String, String>();

                        // adding each child node to HashMap key => value
                        map.put(TAG_ID, id);
                        map.put(TAG_NAME, name);
                        map.put(TAG_EMAIL, email);
                        map.put(TAG_PHONE_MOBILE, mobile);

                        // adding HashList to ArrayList
                        contactList.add(map);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }


                /**
                 * Updating parsed JSON data into ListView
                 * */
        list=(ListView)findViewById(R.id.list);

                // Getting adapter by passing xml data ArrayList
                adapter=new LazyAdapter(this, contactList);        
                list.setAdapter(adapter);

                // Launching new screen on Selecting Single ListItem
                list.setOnItemClickListener(new OnItemClickListener() {

                    @Override
                    public void onItemClick(AdapterView<?> parent, View view,
                            int position, long id) {
                        // getting values from selected ListItem
                        String name = ((TextView) view.findViewById(R.id.name)).getText().toString();
                        String cost = ((TextView) view.findViewById(R.id.email)).getText().toString();
                        String description = ((TextView) view.findViewById(R.id.mobile)).getText().toString();

                        // Starting new intent
                        Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
                        in.putExtra(TAG_NAME, name);
                        in.putExtra(TAG_EMAIL, cost);
                        in.putExtra(TAG_PHONE_MOBILE, description);
                        startActivity(in);

                    }
                });


                list.setOnScrollListener(new OnScrollListener() {



                    @Override
                    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                        if (view.getAdapter() != null && ((firstVisibleItem + visibleItemCount) >= totalItemCount)) {
                            //Log.v(TAG, "onListEnd, extending list");
                            //mPrevTotalItemCount = totalItemCount;
                            counter = totalItemCount;

                            LoadData();
                            adapter.notifyDataSetChanged();}
                    }

                    @Override
                    public void onScrollStateChanged(AbsListView view, int scrollState) {
                    }

                });





    }
}

这是我的LazyAdapter.java文件

import java.util.ArrayList;
import java.util.HashMap;

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

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;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        imageLoader=new ImageLoader(activity.getApplicationContext());
    }

    public int getCount() {
        return data.size();
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }


    public View getView(int position, View convertView, ViewGroup parent) {
        View vi=convertView;
        if(convertView==null)
            vi = inflater.inflate(R.layout.list_row, null);

        TextView title = (TextView)vi.findViewById(R.id.title); // title
        TextView artist = (TextView)vi.findViewById(R.id.artist); // artist name
        TextView duration = (TextView)vi.findViewById(R.id.duration); // duration
        ImageView thumb_image=(ImageView)vi.findViewById(R.id.list_image); // thumb image

        HashMap<String, String> song = new HashMap<String, String>();
        song = data.get(position);



        // Setting all values in listview
        title.setText(song.get(AndroidJSONParsingActivity.TAG_NAME));
        artist.setText(song.get(AndroidJSONParsingActivity.TAG_ID));
        duration.setText(song.get(AndroidJSONParsingActivity.TAG_EMAIL));
        imageLoader.DisplayImage(song.get(AndroidJSONParsingActivity.TAG_PHONE_MOBILE), thumb_image);
        return vi;
    }
}

1 个答案:

答案 0 :(得分:1)

我认为问题在于你的问题是在loadData()方法中。每次重新创建contactList ..

ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();

然后你打电话......

adapter=new LazyAdapter(this, contactList);        
list.setAdapter(adapter);

每次加载数据时都会创建一个新适配器,而不是将数据附加到当前适配器。您已将适配器作为实例变量,因此您不需要每次都初始化它。您应该在onCreate()方法中初始化listview和适配器,然后再也不必这样做了。然后,只需将新的联系人列表添加到现有的适配器中,然后致电notifyDataSetChanged();,您就应该好了。