从android中的JSON生成listview

时间:2012-09-28 14:53:24

标签: android json listview

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

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

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

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

public class AlertsAdapter extends ArrayAdapter<alerts>

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

5 个答案:

答案 0 :(得分:17)

JSON&amp; listview会像这样工作..

1.显示项目列表

Android SDK提供了一种使用名为android.app.ListActivity的超类快速显示数据列表的便捷方法。此活动已经提供了一个ContentView,配置了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));

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元素和文件。您刚刚创建的文件现在可以在Java代码中引用为R.layout.list_item,就像您在自定义列表适配器中接下来一样。

创建一个名为ListAdaptor的私有类(在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中创建一个私有方法来发出请求,解析结果并返回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);  
    }  

现在,在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方法。完成后,将在主UI线程上调用onPostExecute方法。

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

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

listView

最佳网站this&amp; this

-

此致

<强> TechEnd官方

答案 1 :(得分:4)

您需要将JSON对象的重要元素存储到您自己创建的新对象中。

假设您的JSON对象为您提供了名称,日期和电话号码的密钥,您需要一个包含该类信息的对象。

你的listview将采用你的新类型的arrayadapter,listview的每个单元格将包含填充了对象信息的UI元素(例如textviews)

至少这是一个3步骤的过程,您需要单独处理每个步骤的解决方案

答案 2 :(得分:3)

  

在您的活动中尝试此代码首先将json数据解析为String数组   然后在你的活动的xml中设置适配器你的Listview应用

try
   {

   JSONArray jArray = new JSONArray(result);
   JSONObject jObj=new JSONObject ();
   String[] data=new String[jArray.length()]

       for(int i=0;i<jArray.length();i++)
       {
          jObj= jArray.getJSONObject(i);
          data[i]=json_data.getString("value");

       }

       GameAdapter adapter = new GameAdapter(this, R.layout.listview_item_row, data);
       listView1 = (ListView)findViewById(R.id.listView1);
       listView1.setAdapter(adapter);
}
catch(Exception e)
{
}

答案 3 :(得分:1)

我在这个主题上找到了一个很好的resource。现在我有我的Json数据列表。强烈推荐所有新手。谢谢你们的帮助。

答案 4 :(得分:0)

我建议您按照以下步骤操作:

  1. 从网上获取数据并存储
  2. 将存储的数据传递给适配器
  3. 将适配器设置为列表
  4. 在第一步中,我建议您使用AsyncTask类获取数据,该类允许执行后台操作并在UI线程上发布结果,而无需操作线程和/或处理程序。其次,您必须根据您获得的JSON结构来解析您的内容。最后,将数据传递给适配器以填充列表。