动态增加列表视图中的元素数量

2024-03-14

我想增加列表视图滚动到末尾时动态显示的项目数量。 就我而言,我的列表视图最初将显示 10 个项目。然后,当我们滚动到最后一个项目时,它必须开始显示另外 10 个项目,依此类推。 我怎样才能做到这一点??

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

    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] 。所以我每次滚动到最后一项并再次重新填充整个列表时都无法更改数组大小


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

此外,您没有使用 ViewHolder 模式,这极大地提高了性能。查看vogella.com 上有关 ListView 的链接 http://www.vogella.com/articles/AndroidListView/article.html;进一步来说,查看第 3.1 和 3.2 章.

In CustomArrayAdapter, 实施OnScrollListener并添加所需的方法。然后,在onScroll(...),确定是否要添加数据(例如用户到达列表底部)。最后,加载新项目,将它们添加到您的数据集中values.add(product) or values.addAll(products)其中产品是List of Products,并调用notifyDataSetChanged从你的内心CustomArrayAdapter每次致电后values.add(...) or values.addAll(...).

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

In your Activity:

  • 删除线条

    int length = JArray.length();
    feed_products_list = new Product[length+1];
    
  • 消除你的“静电”feed_products_list并将其更改为 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 ...`。

In your Adapter:

  • 上课implement OnScrollListener,并设置onScroll()- 类似以下的方法:

    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.
    }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态增加列表视图中的元素数量 的相关文章

  • 如何从 SDK 实现每个会话的 Google Places 自动完成功能?

    是否可以从 Android 和 iOS 应用程序的 place sdk 实现基于会话的自动完成 根据 6 月 11 日生效的新 Google 地图框架定价 对自动完成的请求可以分为基于击键 会话的请求 我找不到描述实施步骤的文档 除了这个参
  • gradle更新后无法找到方法(无法编译项目)

    我尝试将项目中的 gradle 版本更新为 4 1 milestone 1 以下这些说明 https developer android com studio build gradle plugin 3 0 0 migration html
  • Cheesesquare:enterAlways 会产生错误的布局

    Adding enterAlways到 Cheesesquare 演示的滚动标志
  • Xamarin Android Webview Javascript

    我正在尝试通过 Xamarin for Android 创建一个移动应用程序 它有一个显示网站的 WebView 问题是正常按钮会触发 但 javascript 事件不会触发 我已经启用了 Javascript 但没有运气 如何在 Andr
  • 从响应中获取标头(Retrofit / OkHttp 客户端)

    我正在使用 Retrofit 与 OkHttp 客户端和 Jackson 进行 Json 序列化 并希望获取响应的标头 我知道我可以扩展 OkClient 并拦截它 但这发生在反序列化过程开始之前 我基本上需要的是获取标头以及反序列化的 J
  • 如何在android中显示保存在sdcard文件夹中的图像[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 当我正在显
  • AdapterContextMenuInfo 始终为 null

    我尝试通过 android 开发文档中的书来做到这一点 this didn t create a menu i don t know why registerForContextMenu getListView setListAdapter
  • 通过 WhatsApp 发送消息

    由于我发现了一些较旧的帖子 表明 Whatsapp 不支持此功能 我想知道是否发生了变化 以及是否有办法打开与我通过意图发送的号码进行 Whatsapp 聊天 UPDATE请参阅https faq whatsapp com en andro
  • 自定义首选项中的android首选项水平分隔线?

    我创建了自己的自定义首选项对象来扩展首选项 我创建它们只是因为这些自定义数据类型没有首选项 一切正常 但我的自定义首选项没有相同的外观 因为它们缺少系统首选项对象具有的水平分隔线 我已经查找了创建水平分隔线的代码 但我找不到它是在哪里完成的
  • Android 深度链接至 Instagram 应用

    Instagram 已经发布了 iOS 深层链接的 url 方案 但尚未为 Android 创建文档 有没有办法深入链接到 Android 上的 Instagram 应用程序 以转到 Instagram 应用程序中的特定位置 例如 Inst
  • 图像作为电子邮件附件

    我想构建一个应用程序 我可以在电子邮件中附加图像 打开图像并将其设置为我的壁纸 我想让它跨平台 所以你能告诉我是否可以使用phonegap 或者我是否必须为iphone和android构建一个本机应用程序 您好 如果您只想通过电子邮件附加图
  • Android - AudioRecord类不读取数据,audioData和fftArray返回零

    我是 Android 新手 一直在开发音调分析器应用程序 最低 SDK 8 我读了很多关于如何实现 Audiorecord 类的文章 但我想知道为什么它在我录制时不读取任何数据 我尝试显示 audioData 和 fftArray 的值 但
  • Android 构建发布失败,原因为:java.lang.ArrayIndexOutOfBoundsException:213(pr​​oguard 问题)

    我的项目使用调试构建变体构建得很好 但使用发布变体 Android Studio 会抛出 引起原因 java lang ArrayIndexOutOfBoundsException 213 可能是什么问题 如果我设置minifyEnable
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • Android Studio 缓慢的增量构建

    我已经完成了许多步骤来完善我们的构建系统 those https stackoverflow com questions 16775197 building and running app via gradle and android st
  • 在命令行上卸载 Android SDK 的选定部分

    这与 卸载旧的 Android SDK 版本 https stackoverflow com questions 15182377 uninstall old android sdk versions 除非我想在无头 Linux CI 服务
  • 如何使用 AccessibilityService 在 Android 中模拟按键

    我正在编写一个辅助服务 我一直在尝试在应用程序上进行一些自动搜索 我使用accessibilityservice action paste来填充EditText 然后我需要模拟软键盘上的按键 但我不知道如何做 你们能帮我一下吗 你可以尝试A
  • 我的应用程序中的后退按钮出现问题[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想在手机关闭时清除共享首选项值 你
  • 发布的 Android apk 出现错误“包文件未正确签名”

    我最近将我的应用程序上传到 Android 市场 但是由于错误 下载时它拒绝运行 包文件未正确签名 我首先使用 eclipse 发布了数据包 右键单击导出 创建密钥库然后发布 但它拒绝工作 然后我下载了 keytool 和 jarsigne
  • Android 屏幕方向错误

    我使用的是 Android HTC HERO 2 1 版本 我写的活动

随机推荐

  • iOS 模拟器权限被拒绝并且不显示权限警报对话框

    我正在开发 iOS 模拟器 并且面临请求权限的问题 我的应用程序运行正常 可以访问照片库 相机和位置服务 但是安装新的 XCode 8 1 后 我在模拟器上运行该应用程序 该应用程序不再允许使用照片库或相机或位置服务 我尝试以编程方式请求权
  • 将文件路径拖放到 Java Swing JTextField

    Using 这个问题 https stackoverflow com questions 811248 how can i use drag and drop in swing to get file path 我创建了下面的类 它处理将文
  • 将图片读取为灰度numpy数组,并保存回来

    我尝试了以下操作 希望看到源图像的灰度版本 from PIL import Image import numpy as np img Image open img png convert L arr np array img getdata
  • Server.Transfer() 对比服务器.执行()

    我对调用页面 第一页 和调用者页面 新页面 的请求哪个更好或效果感到困惑 我注意到在这两种情况下 浏览器中的 URL 仍然是首页 URL 不会刷新到新页面 URL 因为浏览器没有被请求这样做 任何值得注意的评论 原文位于 Server Tr
  • 强制虚拟方法表中函数的顺序?

    如何控制虚拟表中虚拟函数的顺序 它们的排列顺序是否与声明的顺序相同 当继承带有虚表的类时 继承类的虚表是基类的扩展 还是仅用继承类的虚函数创建的全新虚表 即虚拟表仍然位于类的索引 0x0 处吗 a 就标准而言 你不能 事实上你甚至不能假设
  • Sql Server 2005插入查询中的单引号和双引号

    地址文本框中有单引号和双引号 如何插入数据库 我用的是SQL2005 我的代码如下 str exec sp cust reg customer Cust Id customer Cust Name customer Gender custo
  • Java 中的特殊字符 \0 {NULL}

    如何替换字符串中的 0 NUL String b 2012yyyy06mm sth what i want String c 2 0 0 0012yyyy06mm String d c replaceAll 0 not work Strin
  • 如何调试 Ionic WebApp?

    我想在 WebStorm 中调试我的离子应用程序 我可以在浏览器中运行该应用程序 但我该如何调试呢 我试过 ionic serve debug这似乎不会触发任何调试 当应用程序在浏览器中运行时 如何调试它 使用 Chrome 您可以输入铬
  • 无法在java servlet中获取会话

    我是第一次使用 servlet 但我取得了很大的进步 我的 servlet 运行良好 因此 我决定采用一种身份验证机制 如果用户提供正确的密码和 ID 则会创建一个会话 但会议对我来说是全新的 所以我不太明白这个逻辑 但我已经开始理解了 正
  • Android:如何将图像资源与R.drawable.imagename进行比较?

    我正在开发一个示例应用程序 其中我需要在 onClick 侦听器中获取图像视图的资源 并将其与我知道存在的图像源进行比较 如果资源相同 我想启动另一个意图 我现在面临的问题是访问 ImageView 及其资源 Id 整数 以与可绘制资源进行
  • 检测 jQuery UI 的可拖动功能悬停在什么上方

    我试图让拖动的元素检测它悬停在stopjQuery 的 UI 可拖动功能的事件 这是我的尝试 但没有成功 artwork draggable stop function e ui ui mouseover function f if f t
  • Swift 2:“Bool”无法转换为“BooleanLiteralConvertible”

    我创建了一个应用程序XCode 6 今天我下载了XCode 7它已将我的应用程序更新为Swift 2 错误有很多 但现在只有一个我无法解决 我不知道为什么 但是Xcode不喜欢任何Bool选项animated并显示此错误 Bool 不能转换
  • FindByIdentity 在 ASP.NET Web 应用程序中失败并出现 PrcipalOperationException

    我在内部 Web 应用程序中使用 System DirectoryServices AccountManagement 时遇到问题 该错误不是很具有描述性 但发生的情况如下 当我尝试验证 AD 中是否存在提供的用户 ID 时 我使用以下代码
  • JAXB 异常:此上下文未知类

    当我调用一个特定的静态服务方法时 该方法是使用CXF 我收到以下错误 有人知道为什么以及如何解决它吗 发生 JAXBException 类 com octory ws dto 配置文件Dto也没有任何 其超类的已知 语境 服务方法及相关DT
  • JPA CriteriaBuilder 将合取条件转换为析取条件

    我需要将此查询复制到JPA 标准生成器 code where article client id 1 and article price gt 0 and article code like this is statement or art
  • Windows批处理:睡眠[重复]

    这个问题在这里已经有答案了 如何让 Windows 批处理脚本等待几秒钟 sleep and wait似乎不起作用 无法识别的命令 你可以试试 ping n XXX 127 0 0 1 gt nul 其中 XXX 是等待的秒数加一
  • JPA CriteriaQuery 计算用于 where 谓词的日期时间差

    我正在尝试从数据库中选择两个字段之间的时间差小于或大于某个值的实体 在标准 SQL 中 这可以使用 TIMESTAMPDIFF 函数简单地完成 SELECT from run where TIMESTAMPDIFF SECOND run e
  • numpy 将 RGB 图像转换为 YIQ 颜色空间

    对于一个类 我需要将 RGB 图像转换为 YIQ 我们被告知可以通过以下方式进行转换 我开始编写一个带有循环的凌乱代码来进行矩阵乘法 然后我发现了一个函数 skimage color yiq2rgb imYIQ 当我往里面看他们在做什么时
  • JavaFX 8 日期选择器功能

    我刚刚开始使用新的 JavaFX 8 控件DatePicker In DatePicker 用户体验文档 https wiki openjdk java net display OpenJFX DatePicker User Experie
  • 动态增加列表视图中的元素数量

    我想增加列表视图滚动到末尾时动态显示的项目数量 就我而言 我的列表视图最初将显示 10 个项目 然后 当我们滚动到最后一个项目时 它必须开始显示另外 10 个项目 依此类推 我怎样才能做到这一点 这是我的自定义阵列适配器 package c