从android中的JSON生成listview

Mik*_*ike 7 android json listview

我是Android的新手,目前正试图从我的服务器中提取的JSON数组生成listview,我已经阅读了很多没有运气的教程,有独特的方法可以做到这一点.请你指点一些好的资源开始吧.

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

import josecgomez.com.android.dev.webservice.objects.alerts;
Run Code Online (Sandbox Code Playgroud)

给我""作为没有确定的资源:

public class AlertsAdapter extends ArrayAdapter<alerts>
Run Code Online (Sandbox Code Playgroud)

谢谢,非常感谢任何帮助!

Rah*_*dia 17

JSON&listview将会像这样工作..

1.显示项目列表

Android SDK提供了一种使用名为android.app.ListActivity的超类快速显示数据列表的便捷方法.此Activity已经提供了一个ContentView,配置了a ListView,随时可以使用并填充数据.

现在需要为ListView提供要显示的数据,以及将数据映射到行的方法.ListAdaptors提供此机制,并使用setListAdaptor在ListActivity的基础ListView上设置.

Android SDK提供的适配器(ArrayAdaptor)知道如何处理任意数据的数组ListViews(Android SDK还附带了其他几个ListAdaptors,例如Cursor Adapters,它可以在将本地数据存储连接到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));
Run Code Online (Sandbox Code Playgroud)

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

为了实现这一点,您将不得不超越内置布局和ArrayAdaptor,而是实现自己的布局.

首先创建一个ABC类,可以用来将作者和内容同时保存为字符串.然后创建并填充一个对象,其中包含一些要在自定义列表项中显示的测试数据:

public class ABC {
    String userId;
    String pwd;
}
Run Code Online (Sandbox Code Playgroud)

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

创建XML文件后,Android Eclipse插件会自动将其添加为生成的R文件的引用.此R文件保存在项目的/ gen文件夹下,充当XML元素和Java代码之间的桥梁.它允许您的Java代码引用在/ res文件夹下创建的XML元素和文件.您刚刚创建的文件现在可以R.layout.list_item在Java代码中引用,就像您在自定义列表适配器中执行的操作一样.

创建一个私有类(在Activity内)调用ListAdaptor哪个子类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;  
    }  
}  
Run Code Online (Sandbox Code Playgroud)

现在可以调整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);  
}  
Run Code Online (Sandbox Code Playgroud)

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

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

我们可以在Activity中创建一个私有方法来发出请求,解析结果并返回一个ArrayList对象.下面列出的代码生成请求并查找结果JSON array,迭代以提取每个text和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);  
    }  
Run Code Online (Sandbox Code Playgroud)

现在,在onCreate方法中构造自定义列表适配器时,将先前使用的虚拟数据替换为对load方法的调用.

abcListAdaptor adaptor = new abcListAdaptor(this,R.layout.list_item, load());  
Run Code Online (Sandbox Code Playgroud)

4.创建响应式用户界面

在当前状态下的代码有可能导致应用程序无响应(ANR)对话框出现,提示用户退出你的应用潜力.这可能是由于长期运行的工作,如在诸如此类的方法中执行数据的远程请求onCreate.

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

虽然Java的Thread类可以用于此任务,但是一旦完成长时间运行的任务,它通常需要更改用户界面以报告结果(即,显示从请求加载的列表),这是一个复杂的问题. .

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

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

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

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

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

最佳网站ListView的.

-

问候

TechEnd官方