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方法.
-
问候
TechEnd官方
| 归档时间: |
|
| 查看次数: |
6349 次 |
| 最近记录: |