我有一个
JSON文件,填充到listview.
我想让列表视图动态化.这意味着,我只需要一个活动来完成我所拥有的列表上的点击操作.填充到Activity的内容(图片,标题,描述)的来源来自Web上的JSON文件.
例如,我在列表中有13个项目,每当我点击其中一个项目时,它转到包含不同图片,标题和描述的一个活动取决于我点击的项目.
我需要有人来改进我在下面提供的代码.
Projects.java
public class Projects {
public String title;
public String keyword;
public String description;
public String smallImageUrl;
public String bigImageUrl;
public int cost;
@Override
public String toString()
{
return "Title: "+title+ " Keyword: "+keyword+ " Image: "+smallImageUrl;
}
}
ProjectsAdapter.java
Public class ProjectsAdapter extends ArrayAdapter<Projects> {
int resource;
String response;
Context context;
//Initialize adapter
public ProjectsAdapter(Context context, int resource, List<Projects> items) {
super(context, resource, items);
this.resource=resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
LinearLayout projectView;
//Get the current alert object
Projects pro = getItem(position);
//Inflate the view
if(convertView==null)
{
projectView = new LinearLayout(getContext());
String inflater = Context.LAYOUT_INFLATER_SERVICE;
LayoutInflater vi;
vi = (LayoutInflater)getContext().getSystemService(inflater);
vi.inflate(resource, projectView, true);
}
else
{
projectView = (LinearLayout) convertView;
}
TextView Title =(TextView)projectView.findViewById(R.id.title);
try {
ImageView i = (ImageView)projectView.findViewById(R.id.image);
Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(pro.smallImageUrl).getContent());
i.setImageBitmap(bitmap);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//Assign the appropriate data from our alert object above
//Image.setImageDrawable(pro.smallImageUrl);
Title.setText(pro.title);
return projectView;
}
}
Main.java
public class Main extends Activity {
/** Called when the activity is first created. */
//ListView that will hold our items references back to main.xml
ListView lstTest;
//Array Adapter that will hold our ArrayList and display the items on the ListView
ProjectsAdapter arrayAdapter;
//List that will host our items and allow us to modify that array adapter
ArrayList<Projects> prjcts=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//Initialize ListView
lstTest= (ListView)findViewById(R.id.lstText);
//Initialize our ArrayList
prjcts = new ArrayList<Projects>();
//Initialize our array adapter notice how it references the listitems.xml layout
arrayAdapter = new ProjectsAdapter(Main.this, R.layout.listitems,prjcts);
//Set the above adapter as the adapter of choice for our list
lstTest.setAdapter(arrayAdapter);
//Instantiate the Web Service Class with he URL of the web service not that you must pass
WebService webService = new WebService("http://pre.spendino.de/test/android/projects.json");
//Pass the parameters if needed , if not then pass dummy one as follows
Map<String, String> params = new HashMap<String, String>();
params.put("var", "");
//Get JSON response from server the "" are where the method name would normally go if needed example
// webService.webGet("getMoreAllerts", params);
String response = webService.webGet("", params);
try
{
//Parse Response into our object
Type collectionType = new TypeToken<ArrayList<Projects>>(){}.getType();
//JSON expects an list so can't use our ArrayList from the lstart
List<Projects> lst= new Gson().fromJson(response, collectionType);
//Now that we have that list lets add it to the ArrayList which will hold our items.
for(Projects l : lst)
{
prjcts.add(l);
}
//Since we've modified the arrayList we now need to notify the adapter that
//its data has changed so that it updates the UI
arrayAdapter.notifyDataSetChanged();
}
catch(Exception e)
{
Log.d("Error: ", e.getMessage());
}
lstTest.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
@SuppressWarnings("unchecked")
Projects p = (Projects ) lstTest.getItemAtPosition(position);
//Do your logic and open up a new Activity.
Intent care = new Intent(Main.this, Organization.class);
startActivity(care);
}
});
}
}
WebService.java(我认为我们不需要编辑这个)
public class WebService{
DefaultHttpClient httpClient;
HttpContext localContext;
private String ret;
HttpResponse response1 = null;
HttpPost httpPost = null;
HttpGet httpGet = null;
String webServiceUrl;
//The serviceName should be the name of the Service you are going to be using.
public WebService(String serviceName){
HttpParams myParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(myParams, 10000);
HttpConnectionParams.setSoTimeout(myParams, 10000);
httpClient = new DefaultHttpClient(myParams);
localContext = new BasicHttpContext();
webServiceUrl = serviceName;
}
//Use this method to do a HttpPost\WebInvoke on a Web Service
public String webInvoke(String methodName, Map<String, Object> params) {
JSONObject jsonObject = new JSONObject();
for (Map.Entry<String, Object> param : params.entrySet()){
try {
jsonObject.put(param.getKey(), param.getValue());
}
catch (JSONException e) {
Log.e("Groshie", "JSONException : "+e);
}
}
return webInvoke(methodName, jsonObject.toString(), "application/json");
}
private String webInvoke(String methodName, String data, String contentType) {
ret = null;
httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2109);
httpPost = new HttpPost(webServiceUrl + methodName);
response1 = null;
StringEntity tmp = null;
//httpPost.setHeader("User-Agent", "SET YOUR USER AGENT STRING HERE");
httpPost.setHeader("Accept",
"text/html,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
if (contentType != null) {
httpPost.setHeader("Content-Type", contentType);
} else {
httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded");
}
try {
tmp = new StringEntity(data,"UTF-8");
} catch (UnsupportedEncodingException e) {
Log.e("Groshie", "HttpUtils : UnsupportedEncodingException : "+e);
}
httpPost.setEntity(tmp);
Log.d("Groshie", webServiceUrl + "?" + data);
try {
response1 = httpClient.execute(httpPost,localContext);
if (response1 != null) {
ret = EntityUtils.toString(response1.getEntity());
}
} catch (Exception e) {
Log.e("Groshie", "HttpUtils: " + e);
}
return ret;
}
//Use this method to do a HttpGet/WebGet on the web service
public String webGet(String methodName, Map<String, String> params) {
String getUrl = webServiceUrl + methodName;
int i = 0;
for (Map.Entry<String, String> param : params.entrySet())
{
if(i == 0){
getUrl += "?";
}
else{
getUrl += "&";
}
try {
getUrl += param.getKey() + "=" + URLEncoder.encode(param.getValue(),"UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
i++;
}
httpGet = new HttpGet(getUrl);
Log.e("WebGetURL: ",getUrl);
try {
response1 = httpClient.execute(httpGet);
} catch (Exception e) {
Log.e("Groshie:", e.getMessage());
}
// we assume that the response body contains the error message
try {
ret = EntityUtils.toString(response1.getEntity());
} catch (IOException e) {
Log.e("Groshie:", e.getMessage());
}
return ret;
}
public static JSONObject Object(Object o){
try {
return new JSONObject(new Gson().toJson(o));
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
public InputStream getHttpStream(String urlString) throws IOException {
InputStream in = null;
int response = -1;
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
if (!(conn instanceof HttpURLConnection))
throw new IOException("Not an HTTP connection");
try{
HttpURLConnection httpConn = (HttpURLConnection) conn;
httpConn.setAllowUserInteraction(false);
httpConn.setInstanceFollowRedirects(true);
httpConn.setRequestMethod("GET");
httpConn.connect();
response = httpConn.getResponseCode();
if (response == HttpURLConnection.HTTP_OK) {
in = httpConn.getInputStream();
}
} catch (Exception e) {
throw new IOException("Error connecting");
} // end try-catch
return in;
}
public void clearCookies() {
httpClient.getCookieStore().clear();
}
public void abort() {
try {
if (httpClient != null) {
System.out.println("Abort.");
httpPost.abort();
}
} catch (Exception e) {
System.out.println("Your App Name Here" + e);
}
}
}
编辑
我想在Organization.java中显示的是这个.xml文件:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/bg"
android:orientation="vertical">
<ImageView
android:id="@+id/project_image"
android:layout_marginTop="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
<TextView
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Default Title"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="#78b257"/>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_marginTop="15dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<Button
android:id="@+id/btn_forward"
android:layout_marginLeft="5dp"
android:layout_gravity="left"
android:text="Weitersagen"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginTop="15dp"/>
<Button
android:id="@+id/btn_sms_spend"
android:layout_marginTop="15dp"
android:layout_marginRight="5dp"
android:text="Per SMS spenden"
android:layout_gravity="right"
android:layout_height="wrap_content"
android:layout_width="wrap_content"/>
</LinearLayout>
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_white"
android:orientation="vertical">
<TextView
android:id="@+id/description"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginLeft="5dp"
android:gravity="left"
android:text="default description"
android:textSize="18sp"
android:textColor="#000000"/>
</LinearLayout>
</ScrollView>
</LinearLayout>
这是JSON文件:
[{
"title": "CARE Deutschland-Luxemburg e.V.",
"keyword": "CARE",
"description": "<p><b>Das CARE-Komplett-Paket für Menschen in Not</b",
"smallImageUrl": "http://cdn.spendino.de/web/img/projects/home/1284113658.jpg",
"bigImageUrl":"http://cdn.spendino.de/web/img/projects/small/1284113658.jpg",
"cost": "5"
},
{
"title": "Brot für die Welt",
"keyword": "BROT",
"description": "<p>„Brot für die Welt“ unterstützt unter der Maßgabe 'Helfen, wo die Not am größten ist' ausgewählte Projekte weltweit.",
"smallImageUrl": "http://cdn.spendino.de/web/img/projects/home/1267454286.jpg",
"bigImageUrl":"http://cdn.spendino.de/web/img/projects/small/1267454286.jpg",
"cost": "5"
},
{
"title": "Deutsche AIDS-Stiftung",
"keyword": "HIV",
"description": "<p>Die Deutsche AIDS-Stiftung unterstützt mit ihren finanziellen Mitteln seit mehr als 20 Jahren Betroffene, die an HIV und AIDS erkrankt sind.",
"smallImageUrl": "http://cdn.spendino.de/web/img/projects/home/1258365722.jpg",
"bigImageUrl":"http://cdn.spendino.de/web/img/projects/small/1258365722.jpg",
"cost": "5"
}]
列表视图的屏幕截图:
如果这些是我要做的步骤,那么我遇到了4号和4号的问题. 5:
1.拥有JSON
2.构建一个合适的数据结构(Array,ArrayList,无论你喜欢什么),以保存关于列表视图的关键数据
3.使用此数据结构作为列表视图的源
4.当用户单击任何行时,尝试在列表视图中找到该行的位置,并在源数据结构中的该位置上查找所需的数据.
5.创建一般处理这些数据的任何活动
6.使用用户在步骤4中单击的行的数据打开该活动
7.在新活动中使用此数据
ConstantData.java:
public class ConstantData extends ArrayList<Projects>{
private static final long serialVersionUID = 9100099012485622682L;
public static Object projectsList;
public ConstantData(){
}
public ConstantData(Parcel in){
}
@SuppressWarnings("unchecked")
public static final Parcelable.Creator CREATOR = new Parcelable.Creator(){
public ConstantData createFromParcel (Parcel in){
return new ConstantData(in);
}
public Object[] newArray(int arg0){
return null;
}
};
private void readFromParcel(Parcel in){
this.clear();
int size = in.readInt();
for (int i = 0; i < size; i++){
Projects p = new Projects();
p.setTitle(in.readString());
p.setKeyword(in.readString());
p.setSmallImageUrl(in.readString());
p.setBigImageUrl(in.readString());
p.setCost(in.readInt());
}
}
public int describeContents() {
return 0;
}
public void writeToParcel (Parcel dest, int flags){
int size = this.size();
dest.writeInt(size);
for (int i = 0; i < size; i++){
Projects p = this.get(i);
dest.writeString(p.getTitle());
dest.writeString(p.getKeyword());
dest.writeString(p.getDescription());
dest.writeString(p.getSmallImageUrl());
dest.writeString(p.getBigImageUrl());
dest.writeInt(p.getCost());
}
}
}
如果不清楚,请告诉我.
非常感谢你
最佳答案 为此,您需要一个数据结构,它将所有json节点保存在索引上,并且应该可以访问您需要的所有活动[Reco:使用GlobalVariables或ConstantData之类的东西,其中包含所有项目属性并使其成为公共静态].
类似:ConstantData.projectData,它可以是仅包含Project对象的arraylist或数组
>现在从列表视图onItemClick方法中,您将获得一个索引(表示其单击的行所在的位置),在捆绑和附加功能的帮助下将其传递给您的单个设计活动.
2.获取所需活动的索引.从ConstantData.projectData获取该索引上的项目对象.
从项目对象填充UI组件.
通过这样做你可以一次又一次地膨胀相同的视图只传递索引,只填充列表可能是一个繁重的操作,但其余的将更快….
编辑:让我为您提供片段.
对于1.在Main.java上,您在itemClick方法中使用这些行
Intent care = new Intent(Main.this, Organization.class);
startActivity(care);
在startActivity和Intent初始化之间添加此行.
care.putExtra("yourPackageStructure.Organization.position",position);
for 2.在Organization.java中
2.1创建一个名为mPosition的整数成员[或你喜欢的名字]
2.2在onCreate()方法中写入mPosition = getIntent().getExtras().getInt(“yourPackageStructure.Organization.position”);
Project project = ConstantData.projectsData.get(mPosition);
因为我不知道Organization.java中有什么,我想说一个数组列表或者包含Projects对象的东西.
以下是您可以使用Organization.java的onCreate方法.
onCreate(){
position = getIntent().getExtras().getInt("yourPackageStructure.Organization.position");
//Below line will get you the projects object
Projects project = ConstantData.projectsList.itemAt(position);
ImageView projectImage = (ImageView)findViewById(R.id.project_image);
Bitmap image = getImageFromUrl(this,project.bigImageUrl);
projectImage.setBitmapDrawable(image);
TextView title = (TextView)findViewById(R.id.title);
title.setText(project.title);
TextView description = (TextView)findViewById(R.id.description);
description .setText(project.description);
}
这是我用于getImageFromUrl方法的内容
public static Bitmap getImageFromUrl(Context context, String urlString) {
try {
if (haveInternet(context)) {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setDoInput(true);
conn.connect();
int length = conn.getContentLength();
InputStream is = conn.getInputStream();
Bitmap bmImg = BitmapFactory.decodeStream(is);
return bmImg;
} else {
return null;
}
} catch (MalformedURLException e) {
Log.e("Problem in image", e.toString(), e);
e.printStackTrace();
} catch (Exception e) {
Log.e("Problem in image", e.toString(), e);
}
return null;
}
这是haveInternet方法
private static boolean haveInternet(Context context) {
NetworkInfo info = getNetworkInfo(context);
if (info == null || !info.isConnected()) {
return false;
}
if (info.isRoaming()) {
// here is the roaming option you can change it if you want to
// disable internet while roaming, just return false
return true;
}
return true;
}
希望它能帮助你正确…
添加了ConstantData
ConstantData.java
public class ConstantData{
//All public static members will be here
public static final long guid = A LONG VAL;
public static String licenceText = A STRING VAL;
//etc... etc... above members are just the idea that what kind of members can be there in //ConstantData... I normally use all public static properties here
//Here is the variable you probably want
public static ArrayList<Projects> projectsList = new ArrayList<Projets>();
}
如果你想填充这个数组列表,你可以从main.java检查行
for(Projects l : lst)
{
prjcts.add(l);
}
您可以添加或替换此行. ConstantData.projectsList.add(升);我建议你添加线而不是显示线…..