如何将部分数据填充到ListView中

时间:2015-02-11 10:51:23

标签: android json listview android-listview

我仍然将所有JSON数据填充到ListView中,但现在我想根据可见性填充(记录到ListView),当用户滚动时我想显示progess bar 5秒然后想要填充更多记录(那些将对用户可见)等等......

我不想第一次将所有数据填充到ListView中!

MainActivity.java:

public class MainActivity extends Activity {

ArrayList<Main> arrayList;  
MainAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    arrayList = new ArrayList<Main>();
    new JSONAsyncTask().execute("....");

    ListView listview = (ListView)findViewById(R.id.list);
    adapter = new MainAdapter(getApplicationContext(), R.layout.row, arrayList);

    listview.setAdapter(adapter);

    listview.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int position,
                long id) {
            // TODO Auto-generated method stub
            Toast.makeText(getApplicationContext(), arrayList.get(position).getTitle(), Toast.LENGTH_LONG).show();              
           }
      });
  }


class JSONAsyncTask extends AsyncTask<String, Void, Boolean> {

    ProgressDialog dialog;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog = new ProgressDialog(MainActivity.this);
        dialog.setMessage("Loading, please wait");
        dialog.show();
        dialog.setCancelable(false);
    }

    @Override
    protected Boolean doInBackground(String... urls) {
        try {

            //------------------>>
            HttpGet httppost = new HttpGet(urls[0]);
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse response = httpclient.execute(httppost);

            // StatusLine stat = response.getStatusLine();
            int status = response.getStatusLine().getStatusCode();

            if (status == 200) {
                HttpEntity entity = response.getEntity();
                String data = EntityUtils.toString(entity);


                JSONObject jsono = new JSONObject(data);
                JSONArray jarray = jsono.getJSONArray("data");

                for (int i = 0; i < jarray.length(); i++) {
                    JSONObject object = jarray.getJSONObject(i);

                    Main main = new Main();

                    main.setTitle(object.getString("title"));   
                    Log.v("title:", object.getString("title"));

                    arrayList.add(main);
                }
                return true;
            }

            //------------------>>

        } catch (ParseException e1) {
            e1.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return false;
    }

    protected void onPostExecute(Boolean result) {
        dialog.cancel();
        adapter.notifyDataSetChanged();
        if(result == false)
            Toast.makeText(getApplicationContext(), "Unable to fetch data from server", Toast.LENGTH_LONG).show();

    }
  }
}

MainAdapter.java:

public class MainAdapter extends BaseAdapter {
    ArrayList<Main> arrayList;
    LayoutInflater layoutInflater;
    int resource;
    ViewHolder viewHolder;

    public MainAdapter(Context context, int resource, ArrayList<Main> arrayList) {

        this.layoutInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.resource = resource;
        this.arrayList = arrayList;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return arrayList.size();
    }


    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return arrayList.get(position);
    }


    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // convert view = design
        View view = convertView;
        if (view == null) {
            viewHolder = new ViewHolder();
            view = layoutInflater.inflate(resource, null);

            viewHolder.tvName = (TextView) view.findViewById(R.id.tvName);

            view.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) view.getTag();
        }

        viewHolder.tvName.setText(arrayList.get(position).getTitle());

        return view;

    }

    static class ViewHolder {
        public TextView tvName;

    }

}

1 个答案:

答案 0 :(得分:0)

您可以尝试使用this library(Android-Infinite-Scroll-Listview) 我之前使用过,而且很容易使用。