草庐IT

android - 在android中从JSON生成 ListView

coder 2023-11-24 原文

我对 Android 完全陌生,目前正在尝试从从我的服务器中提取的 JSON 数组生成 ListView ,我已经阅读了很多教程但没有运气,有一种独特的方法可以做到这一点。能否请您指出一些好的开始资源。

我已阅读 this页面但是我坚持使用以下代码:

import josecgomez.com.android.dev.webservice.objects.alerts;

给我 ""作为没有确定的资源:
public class AlertsAdapter extends ArrayAdapter<alerts>

谢谢,非常感谢您的帮助!

最佳答案

JSON & listview会这样工作..

1.显示项目列表

Android SDK 提供了一种使用名为 android.app.ListActivity 的父类(super class)快速显示数据列表的便捷方法。这个Activity已经提供了一个ContentView,配置了ListView ,准备使用并填充数据。

现在需要为 ListView 提供要显示的数据,以及将该数据映射到行的方法。 ListAdaptors 提供了这种机制,并使用 setListAdaptor 在 ListActivity 的底层 ListView 上设置。

一个 Android SDK 提供的适配器 (ArrayAdaptor)知道如何将任意数据数组处理成 ListViews (Android SDK 还附带了其他几个 ListAdaptors ,例如 Cursor Adaptors,它们可以在将本地数据存储连接到 ListView 时提供帮助)。您还需要为适配器提供一个布局,它可以用来将元素呈现到每一行上。在下面的示例中,我们使用 Android SDK 提供的布局 simple_list_item_1,这是一个单一的文本标签——非常适合放置我们的单个字符串:

String[] elements = {"Line 1", "Line 2"};
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, elements));

2.自定义每个列表项的外观

为了实现这一点,您必须超越内置布局和 ArrayAdaptor 并实现您自己的布局。

首先创建一个 ABC 类,该类可用于将作者和内容保存为字符串。然后用一些测试数据创建并填充一个对象,以显示在自定义列表项中:
public class ABC {
    String userId;
    String pwd;
}

/res/layout/list_item.xml 中创建布局 XML 文件定义两个 TextViews在单独的行上显示内容和作者。为了将它们显示在另一个之上,请使用 LinearLayout,配置为垂直渲染其中的每个元素 (android:orientation="vertical") .

创建 XML 文件后,Android Eclipse 插件会自动将其作为引用添加到生成的 R 文件中。这个 R 文件保存在项目的/gen 文件夹下,充当 XML 元素和 Java 代码之间的桥梁。它允许您的 Java 代码引用在/res 文件夹下创建的 XML 元素和文件。您刚刚创建的文件现在可以引用为 R.layout.list_item在 Java 代码中,正如您接下来在自定义列表适配器中所做的那样。

创建一个名为 ListAdaptor 的私有(private)类(在 Activity 内)哪个子类ArrayAdaptor .此类应用于存储正在显示的 ArrayList,并提供一种将对象映射到 TextViews 的方法。您在上面的布局中创建。

此映射覆盖 ListAdaptor,并应返回一个 View 对象,其中填充了请求位置的数据内容。

自定义 abcListAdaptor 的完整实现如下:
private class abcListAdaptor extends ArrayAdapter<abc> {  
    private ArrayList<abc> abc;  
    public abcListAdaptor(Context context, int textViewResourceId, ArrayList<abc> items) {  
        super(context, textViewResourceId, items);  
        this.abc = items;  
    }  

    @Override  
    public View getView(int position, View convertView, ViewGroup parent) {  
        View v = convertView;  

        if (v == null) {  
            LayoutInflater vi = (LayoutInflater) getSystemService                          
(Context.LAYOUT_INFLATER_SERVICE);  
            v = vi.inflate(R.layout.list_item, null);  
        }  

        abc o = abc.get(position);  
        TextView tt = (TextView) v.findViewById(R.id.uid);  
        TextView bt = (TextView) v.findViewById(R.id.pwd);  
        tt.setText(o.userid);  
        bt.setText(o.pwd);  
        return v;  
    }  
}  

现在可以调整 onCreate 方法以将自定义列表适配器与创建的测试数据一起使用,如下所示:
public void onCreate(Bundle savedInstanceState) {  
super.onCreate(savedInstanceState);  
abc a = new abc();  
a.userid = "tech";  
a.pwd = "android";  
ArrayList<abc> items = new ArrayList<abc>();  
items.add(a);  
abcListAdaptor adaptor = new abcListAdaptor(this,R.layout.list_item, items);  
setListAdapter(adaptor);  
}  

3.访问远程服务和解析数据

Android SDK 包含旨在简化对基于 HTTP 的 API 的访问的包。 Apache HTTP 类已经包含在内,可以在 org.apache.http package 下找到。 .您将使用这些类以及 org.json类来解析从服务器返回的数据。

我们可以在 Activity 中创建一个私有(private)方法来发出请求,解析结果,并返回 ArrayList的对象。下面列出的代码发出请求并查找结果 JSON array ,它被迭代以提取每个文本和 from_user 元素。
ArrayList<abc> getDetail= new ArrayList<abc>();  
    try {  
        HttpClient hc = new DefaultHttpClient();  
        HttpGet get = new  
        HttpGet("<a href="http://your URL"></a>");  
        HttpResponse rp = hc.execute(get);  

        if(rp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {  
            String result = EntityUtils.toString(rp.getEntity());  
            JSONObject root = new JSONObject(result);  
            JSONArray sessions = root.getJSONArray("results");  

            for (int i = 0; i < sessions.length(); i++) {  
                JSONObject session = sessions.getJSONObject(i);  
                abc a = new abc();  
                a.uid = session.getString("user");  
                a.pwd = session.getString("password");  
                getDetail.add(a);  
            }  
        }  
    } 

    catch (Exception e) {  
        Log.e("Activity", "Error loading JSON", e);  
    }  

现在,在 onCreate 方法中构造自定义列表适配器时,将您之前使用的虚拟数据替换为对 load 方法的调用。
abcListAdaptor adaptor = new abcListAdaptor(this,R.layout.list_item, load());  

4.创建响应式用户界面

当前状态下的代码可能会导致出现应用程序无响应 (ANR) 对话框,提示用户退出您的应用程序。这可能是由于在诸如 onCreate 之类的方法中执行远程数据请求的长时间运行工作造成的。 .

不应在主应用程序线程(驱动用户界面事件循环)上执行长时间运行的任务。相反,它们应该被派生到子线程中来执行工作。

而 Java 的 Thread类可用于此任务,有一个复杂之处在于,一旦长时间运行的任务完成,它通常希望更改用户界面以报告结果(即显示从请求加载的列表)。

用户界面元素只能从主线程改变其状态,因为 Android UI 工具包不是线程安全的,因此后台线程需要向主线程发送消息以操作 UI。

幸运的是,Android SDK 提供了一个方便的类 AsyncTask,它为异步任务与 UI 线程安全交互提供了一种简单的机制。这是通过继承 AsyncTask 并覆盖 doInBackground 方法来执行长时间运行的任务,然后覆盖 onPostExecute 以在 UI 上执行任何操作来实现的。

当创建 AsyncTask(它必须在 UI 线程上创建)并执行时,会在后台线程上调用 doInBackground 方法。完成后,onPostExecute 方法会在主 UI 线程上调用回来。

要在您的应用程序中使用它,您需要在 Activity 中实现一个名为 MyTask 的私有(private)类(如自定义适配器类),它是 AsyncTask 的子类。您可以使用先前加载方法的内容覆盖 doInBackground 方法。

不是返回 ArrayList,而是在 Activity 中维护一个实例变量,以便可以在私有(private)类之间共享数据。然后在 onPostExecute 中,您可以使用数据设置列表适配器,就像之前在 onCreate 中所做的那样。 onCreate 方法现在只是创建 MyTask 对象并调用 execute 方法。

最佳网站 ListView this & this .

——

问候

技术结束

关于android - 在android中从JSON生成 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12642382/

有关android - 在android中从JSON生成 ListView的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  3. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  4. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  5. ruby-on-rails - Ruby on Rails - 为文本区域和图片生成列 - 2

    我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数

  6. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  7. ruby-on-rails - 如何使用 Rack 接收 JSON 对象 - 2

    我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":

  8. ruby-on-rails - 如何在 Rails 3 中创建自定义脚手架生成器? - 2

    有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我

  9. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

  10. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

随机推荐