我是Android的新手,目前正试图从我的服务器中提取的JSON数组生成listview,我已经阅读了很多没有运气的教程,有独特的方法可以做到这一点。请你指点一些好的资源开始吧。
我已阅读this页面,但我坚持使用以下代码:
import josecgomez.com.android.dev.webservice.objects.alerts;
给我“”作为没有确定的资源:
public class AlertsAdapter extends ArrayAdapter<alerts>
谢谢,非常感谢任何帮助!
答案 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 的-
此致
<强> 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)
我建议您按照以下步骤操作:
在第一步中,我建议您使用AsyncTask
类获取数据,该类允许执行后台操作并在UI线程上发布结果,而无需操作线程和/或处理程序。其次,您必须根据您获得的JSON结构来解析您的内容。最后,将数据传递给适配器以填充列表。