2013-05-31 49 views
-7

靜態內容,我用簡單的列表適配器在上面的代碼中的this的地方就說明this不能在靜態內容使用。爲什麼?不能在我的Android應用程序</p> <pre><code>ListAdapter adapter = new SimpleAdapter(this, jsonParseList , R.layout.list_view, new String[] {"conv_title","content"}, new int[] { R.id.conv_title, R.id.content }); listView.setAdapter(adapter); </code></pre> <p>使用「本」在機器人

public class Json extends Activity { 
    static HttpURLConnection urlConnection; 
    static ListView listView; 
    //ArrayList<String> jsonParseList = new ArrayList<String>(); 
    Jsonparser jsonparser; 
    enter code here 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.json_main); 
     listView = (ListView) findViewById(android.R.id.list); 
     jsonparser = new Jsonparser(); 
     jsonparser.execute(""); 
     Log.e("List Activity", "" + jsonParseList); 
    } 

    public static HttpURLConnection openConnection() throws Exception { 
     int responseCode = -1; 
     try { 
      URL url = new URL(
        " place ur url"); 
      urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.setRequestMethod("POST"); 
      urlConnection.setRequestProperty("Content-Type", 
        "application/x-www-form-encoded"); 
      urlConnection 
        .setRequestProperty(
          "Content-Length", 
          "" 
            + Integer 
              .toString("place ur url" 
                .getBytes().length)); 
      urlConnection.setRequestProperty("Content-Language", "en-US"); 
      urlConnection.setRequestProperty("Accept-Encoding", "identity"); 
      urlConnection.setUseCaches(false); 
      urlConnection.setDoInput(true); 
      urlConnection.setDoOutput(true); 
      urlConnection.setReadTimeout(10 * 1000); 
      urlConnection.setConnectTimeout(10 * 1000); 
      DataOutputStream wr = new DataOutputStream(
        urlConnection.getOutputStream()); 
      wr.writeBytes("place ur url"); 
      wr.flush(); 
      wr.close(); 
      responseCode = urlConnection.getResponseCode(); 
      if (responseCode != HttpURLConnection.HTTP_OK) { 
       throw new Exception("Server not responding"); 
      } 
     } catch (SocketException e) { 
      throw new Exception("Connection Time Out"); 
     } catch (java.net.UnknownHostException unknownHostException) { 
      // TODO: handle exception 
      throw new Exception("unknownHostException"); 
     } catch (Exception e) { 
      // TODO: handle exception 
      throw new Exception("Error Occured"); 
     } 
     return urlConnection; 
    } 

    public static ArrayList<String> jsonParseList = new ArrayList<String>(); 

    public static ArrayList<String> jsonParsing() { 
     // TODO Auto-generated method stub 
     StringBuffer buffer = new StringBuffer(); 
     JSONArray array; 

     try { 
      try { 
       urlConnection = openConnection(); 
      } catch (Exception e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
      BufferedReader bufferedReader = new BufferedReader(
        new InputStreamReader(urlConnection.getInputStream())); 
      String line = bufferedReader.readLine(); 
      while (line != null) { 
       buffer.append(line); 
       line = bufferedReader.readLine(); 
      } 
      bufferedReader.close(); 
      if (buffer.toString() != null) { 
       try { 
        array = new JSONArray(buffer.toString()); 
        JSONObject jsonObject; 
        for (int i = 0; i < array.length(); i++) { 

         jsonObject = array.getJSONObject(i); 
         String conv_title = jsonObject.getString("conv_title"); 
         String content = jsonObject.getJSONObject("first_post") 
           .getString("content"); 
         String creator = jsonObject.getJSONObject("first_post") 
           .getJSONObject("creator").getString("name"); 

         HashMap<String, String> map = new HashMap<String, String>(); 

         // adding each child node to HashMap key => value 

         //map.put("id", String.valueOf(i)); 
         map.put("conv_title", jsonObject.getString("conv_title")); 
         map.put("content", jsonObject.getString("content")); 
         map.put(conv_title, conv_title); 
         map.put(content, content); 
         Log.e("List Values", conv_title); 
         Log.e("List Values", content); 

         jsonParseList.add("conv_title "+"content"); 
        } 
       } catch (JSONException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       ListAdapter adapter = new SimpleAdapter(this, jsonParseList , R.layout.list_view, 
          new String[] {"conv_title","content"}, 
          new int[] { R.id.conv_title, R.id.content }); 

       listView.setAdapter(adapter); 
      } 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return jsonParseList; 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    private class Jsonparser extends AsyncTask<String, Void, ArrayList<String>> { 

     @Override 
     protected ArrayList<String> doInBackground(String... params) { 
      // TODO Auto-generated method stub 
      return jsonUtil.jsonParsing(); 

     } 

     @Override 
     protected void onPostExecute(ArrayList<String> result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 
      if (result instanceof ArrayList<?>) { 
       jsonParseList = result; 

      } 
     } 
    } 
} 
+1

大概你是從靜態方法做到這一點的。你期望什麼*在這種情況下'this'的價值?目前還不清楚你對「靜態」的含義有多瞭解。 –

+1

下一次請向我們展示方法簽名,因此給其他人回答您的問題 – fGo

回答

0

這是不可能的,因爲你沒有顯示周圍的代碼。

通常,this指的是執行方法所屬的對象;你只能在實際的方法中使用它。

2

而是採用

ListAdapter adapter = new SimpleAdapter(this, jsonParseList , R.layout.list_view, new String[] {"conv_title","content"}, new int[] { R.id.conv_title, R.id.content }); 

使用像

ListAdapter adapter = new SimpleAdapter(ClassName.this, jsonParseList , R.layout.list_view, new String[] {"conv_title","content"}, new int[] { R.id.conv_title, R.id.content }); 
+1

會更容易,因爲給出的錯誤暗示在靜態方法中使用,您的解決方案不太可能奏效。你的建議可以在嵌套或匿名內部類的上下文中工作,但不在靜態上下文中。 – njzk2

+0

'ClassName.this'是什麼意思? – fGo

+0

@Joy Helina:仍然不接受..它顯示代碼下的紅線.. – Sandy

2

this關鍵字是指一類的當前對象。所以它與一個對象有關。但靜態方法與類有關。因此您不能在靜態上下文中使用this

2

在靜態方法或字段中不能使用this,因爲this引用當前實例。

0

靜態方法不會有任何類的實例。 this是當前類的對象。所以this不能在靜態方法中使用。

new SimpleAdapter(getApplication(), jsonParseList , R.layout.list_view, 
        new String[] {"conv_title","content"}, 
        new int[] { R.id.conv_title, R.id.content }); 

試着用這種方法。

我希望我能解釋清楚一點。

+0

然後我要放在那個place.please建議.. – Sandy

+0

@Sandy看到更新 – Gunaseelan

+0

它仍然顯示紅色在getApplication()下標記.. – Sandy

0

您不能使用該這樣。您的解決方案是:

  1. 創建一個靜態字段並啓動onCreate。
  2. 稍後在靜態內容中使用。

請參閱本:

static Context thisContext; 

    onCreate(.....){ 
     thisContext = this; 
    } 
0

「這」指的是類中的方法被調用的當前實例。 靜態方法從類本身調用,所以「this」不能在該上下文中使用。

一個解決辦法:

不要讓那些方法靜態和與類的一個實例工作。

相關問題