动态增加列表视图中的元素数量 [英] Dynamically increasing the number of elements in a listview

查看:105
本文介绍了动态增加列表视图中的元素数量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想增加列表视图滚动到末尾时将动态显示的列表数量. 在我的情况下,我的列表视图最初将显示10个项目.那么当我们滚动到最后一个项目时,它必须开始显示另外10个项目,依此类推. 我该怎么办??

I want to increase the number of items my list view will display dynamically when the list view is scrolled to the end. In my case my listview will display 10 items initially. then when we scroll to the last item it must start displaying 10 more items and so on. how can i do that??

这是我的自定义阵列适配器

Here is my custom array adapter

    package com.android.listview;

import java.util.ArrayList;

import com.android.listview.R;
import com.android.listview.Product;

import android.widget.ArrayAdapter;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.android.listview.ListViewActivity;

public class CustomArrayAdapter extends ArrayAdapter<Product> implements
        OnScrollListener {

    private final Context context;
    private final ArrayList<Product> values;

    static class ViewHolder {
        public TextView text;
        public ImageView image;
    }

    public CustomArrayAdapter(Context arg0, int arg1, int arg2,
            ArrayList<Product> arg3) {
        super(arg0, arg1, arg2, arg3);
        this.context = arg0;
        this.values = arg3;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        int product_id = 0;
        View rowView = inflater.inflate(R.layout.feed_items, parent, false);
        try {

            ImageView wic_logo = (ImageView) rowView.findViewById(R.id.logo);
            TextView label = (TextView) rowView.findViewById(R.id.label);

            Product p = values.get(position);
            product_id = p.productId;
            String date = new java.text.SimpleDateFormat("dd/MM/yy")
                    .format(new java.util.Date(p.timeStamp));
            label.setText(p.productName + "\n" + p.reportedPrice + "   MRP: "
                    + p.mrp + "\n" + "Discount: " + p.discount + "%   "
                    + p.area + "  " + p.city + "\n" + "Shared by " + p.userName
                    + " " + "on" + " " + date);

            wic_logo.setImageResource(R.drawable.wic_logo_small);
            Log.d("date", "" + date);

            Log.d("Custom Array Adapter", "at" + position);
        } catch (Exception e) {
            Log.d("Custom Array Adapter", "catch");
        }

        return rowView;
    }

    public void onScroll(AbsListView arg0, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        Log.d("entered onScroll", " " + firstVisibleItem + visibleItemCount
                + totalItemCount);
        if (((firstVisibleItem + visibleItemCount) >= totalItemCount - 1)) {
            Log.d("entered if", " " + firstVisibleItem + visibleItemCount
                    + totalItemCount);
            // if we're at the bottom of the listview, load more data
            addData(totalItemCount, values.get(totalItemCount).productId);
        }
    }

    private void addData(int totalItemCount, int productId) {

        Toast.makeText(getContext(), "last item", Toast.LENGTH_SHORT).show();
    }

    public void onScrollStateChanged(AbsListView arg0, int arg1) {

    }
}

这是我的活动

package com.android.listview;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.android.listview.CustomArrayAdapter;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.Button;
import android.widget.ListView;

public class ListViewActivity extends Activity {

    static Product[] feed_products_list;
    private JSONArray JArray;
    private InputStream is;
    private StringBuilder sb;
    private String result;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button feed_button = (Button) findViewById(R.id.feedButton_feed);
        feed_button.setBackgroundResource(R.color.grey);
        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        try {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://10.0.2.2/wic2/mobile/feed");
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();

            try {
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(is, "iso-8859-1"), 8);
                sb = new StringBuilder();
                sb.append(reader.readLine() + "\n");
                String line = "0";
                while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
                }
                is.close();
                result = sb.toString();
                Log.d("result", result);
            } catch (Exception e) {
                Log.e("error", "Error in http connection" + e.toString());
            }

            Log.e("response", "response is:" + response.toString());
        } catch (Exception e) {
            Log.e("error", "Error in http connection" + e.toString());
        }

        ListView tv = (ListView) findViewById(R.id.feedListView);
        try {
            Log.d("JArray", "entered try");
            JArray = new JSONArray(result);
            int length = JArray.length();
            feed_products_list = new Product[length+1];
            Log.d("JArray", "try last line");
        } catch (JSONException e) {
            Log.d("JArray", "in catch");
            e.printStackTrace();
        }

        JSONObject jsonObj;

        for (int i = 0; i < JArray.length(); i++) {
            try {
                Log.d("jsonObj", "entered try");
                jsonObj = JArray.getJSONObject(i);
            } catch (Exception e) {
                Log.d("jsonObj", "in catch");
                continue;
            }

            try {
                Log.d("feed_products_list", "entered try");
                feed_products_list[i] = new Product(jsonObj.getInt("id"),
                        jsonObj.getString("image"),
                        jsonObj.getString("product_name"),
                        jsonObj.getString("reported_price_formated"),
                        jsonObj.getString("store_area"),
                        jsonObj.getString("store_city"),
                        jsonObj.getString("mrp"),
                        jsonObj.getString("user_name"),
                        jsonObj.getLong("reported_timestamp"),
                        jsonObj.getInt("discount"));
                Log.d("feed_products_list", feed_products_list[i].productName);
            } catch (JSONException e) {
                Log.d("feed_products_list in catch",
                        feed_products_list[i].productName);
                e.printStackTrace();
            }
        }

        tv.setAdapter(new CustomArrayAdapter(this, R.layout.feed_items,
                R.id.label, feed_products_list));


    }
}

还有一个问题是,我必须使用JArray中的项目数来初始化数组feed_products_list [length].因此,每次滚动到最后一个项目并再次重新填充整个列表时,我都无法更改数组大小

and one more problem is that i have to initialize my array feed_products_list[length] with the number of items in the JArray. so i cannot change array size every time i scroll to the last item and re-populate the whole list again

推荐答案

首先,您的代码存在一些问题.在您的Activity中,将变量values更改为ArrayList<Product>,因为创建后无法操纵数组的长度.接下来,将JArray重命名为jArray;如果首字母是大写字母,则应表示您正在处理的是类而不是变量.

First, there's a few problems with your code. In your Activity, change your variable values to an ArrayList<Product> since you cannot manipulate the length of an array after creation. Next, rename JArray to jArray; if the first letter is a capital that should indicate you're dealing with a class instead of a variable.

此外,您没有使用ViewHolder模式,该模式可以大大提高性能.查看此vogella.com上有关ListView的链接;更具体地说,请查看第3.1和3.2章.

Also, you're not using the ViewHolder pattern, which greatly improves performance. Check out this link on vogella.com about ListView; more specifically, check out chapters 3.1 and 3.2.

CustomArrayAdapter中,实现OnScrollListener并添加所需的方法.然后,在onScroll(...)中,确定是否要添加数据(例如,用户到达列表的底部).最后,加载新项目,使用values.add(product)values.addAll(products)将它们添加到数据集中,其中product是ProductList,并在每次调用values.add(...)之后从CustomArrayAdapter内部调用notifyDataSetChanged >或values.addAll(...).

In CustomArrayAdapter, implement OnScrollListener and add the required methods. Then, in onScroll(...), determine if you want to add data (e.g. user reached bottom of list). Finally, load the new items, add them to your dataset with values.add(product) or values.addAll(products) where products is a List of Products, and call notifyDataSetChanged from within your CustomArrayAdapter after every call to values.add(...) or values.addAll(...).

例如,您可以在代码中更改以下内容:

For example, you could change the following in your code:

在您的活动中:

  • 删除行

  • Remove the lines

int length = JArray.length();
feed_products_list = new Product[length+1];

  • 从您的feed_products_list中删除静态"并将其更改为ArrayList:

  • Remove the 'static' from your feed_products_list and change it to an ArrayList:

    private ArrayList<Product> feed_products_list = new ArrayList<Product>();
    

  • 而不是feed_products_list[i] = new Product(jsonObj.getInt("id"), .... yadiya ...,调用feed_products_list.add(new Product(jsonObj.getInt("id"),... yadiya ...`.

  • Instead of feed_products_list[i] = new Product(jsonObj.getInt("id"), .... yadiya ..., call feed_products_list.add(new Product(jsonObj.getInt("id"), ... yadiya ...`.

    在您的适配器中:

    • 设置类implement OnScrollListener,然后将onScroll()方法设置为如下所示:

    • Make the class implement OnScrollListener, and set the onScroll()-method to something like the following:

    public void onScroll(AbsListView view, int firstVisibleItem,
                            int visibleItemCount, final int totalItemCount) {
        if(((firstVisibleItem + visibleItemCount) >= totalItemCount)) {
    
            // if we're at the bottom of the listview, load more data
            addData(totalItemCount);
        }
    }
    

  • 创建方法addData(long offset):

    private void addData(long offset) {
    
        // download your data, pass the offset so you know where to start
        // and when you convert your json into `Product`s
        Product product = new Product(JSONObject.getInt("id"), ... yadiya ...);
        this.add(product);
        this.notifyDataSetChanged();
    
        // make sure to call notifyDataSetChanged() on your UI-Thread.
    }
    

  • 这篇关于动态增加列表视图中的元素数量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆