2011-04-08 54 views
2

我有一個JSON文件被填充到listview.First,我想知道如何使我的列表視圖是可點擊的,並導致另一個活動。Android:使列表視圖可點擊和動態與JSON

第二,我想使列表視圖動態。這意味着,我只需要一個活動來進行列表中的點擊操作。內容的來源(圖片,標題,說明)填充到活動來自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()); 
     } 


    } 

} 

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); 
     } 
    } 


} 

和這裏的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" 
}] 

列表視圖的屏幕截圖: enter image description here

如果事情不清楚,請告訴我。 非常感謝您

+0

如何點擊移動類時? 感謝:D – jevrie 2011-10-08 05:39:18

回答

3

使用此實施點擊:

所有的
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. 
      } 
     }); 
+0

所以我在你的評論後添加了這一行:Intent intent = new Intent(Main.this,ProjektADH.class); \t startActivity(intent);但是當我點擊該項目時,該應用程序崩潰。我應該添加更多什麼? Thx – hectichavana 2011-04-08 10:04:34

+0

嘗試調試它:-)它顯示clickListener正在工作。 – 2011-04-08 10:08:24

+0

首先爲位置做烤麪包,然後將其轉換爲對象..等等 – 2011-04-08 10:09:11

1

首先,JSON是不會爲你做這個。你必須實現你的邏輯。
考慮JSON就像一個巨大的數據轉儲。

這裏是你應該如何去做:

  1. 有JSON
  2. 構建一個合適的數據結構(數組,ArrayList中,不管你喜歡)來保存你的列表視圖中的關鍵數據
  3. 當用戶單擊任何行時,嘗試查找列表視圖中該行的位置,並在源數據結構中的該位置上查找數據時,將此數據結構用作列表視圖的源
  4. 需要。
  5. 創造出處理這些數據一般
  6. 打開活動與該行的哪個用戶在步驟點擊數據4
  7. 在新的活動消耗這個數據

這樣的活動,你可以將動態添加到您的活動,根據所點擊的行顯示數據

+0

我在做數字4的邏輯時遇到了麻煩,你能通過編輯我的代碼來幫助我嗎? Thx很多提前 – hectichavana 2011-04-08 11:34:04