2017-02-07 83 views
0

我正在開發一個應用程序,它從聯機的JSON對象文件中讀取數據。我已經成功地將數據獲取到應用程序中,並在列表視圖中正常閱讀。我如何爲列表視圖實現OnclickListener,以便當用戶單擊標題時將它們帶到一個新的活動中,然後在textViews中顯示該項目的所有數據。我的代碼來獲取數據在我的佈局下面。爲ListView JSON對象實現OnclickListener

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.util.ArrayList; 
import java.util.HashMap; 

public class MainActivity extends AppCompatActivity { 

private String TAG = MainActivity.class.getSimpleName(); 

private ProgressDialog pDialog; 
private ListView lv; 

// URL to get Android Version Data JSON 
private static String url = "http://codetest.cobi.co.za/androids.json"; 

ArrayList<HashMap<String, String>> androidversions; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    androidversions = new ArrayList<>(); 

    lv = (ListView) findViewById(R.id.list); 

    new GetVersions().execute(); 
} 

private class GetVersions extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     // Showing progress dialog 
     pDialog = new ProgressDialog(MainActivity.this); 
     pDialog.setMessage("Please wait..."); 
     pDialog.setCancelable(false); 
     pDialog.show(); 
    } 
    @Override 
    protected Void doInBackground(Void... arg0) { 
     HttpHandler sh = new HttpHandler(); 

     // Making a request to url and getting response 
     String jsonStr = sh.makeServiceCall(url); 

     Log.e(TAG, "Response from url: " + jsonStr); 

     if (jsonStr != null) { 
      try { 
       JSONObject jsonObj = new JSONObject(jsonStr); 

       // Getting JSON Array node 
       JSONArray versions = jsonObj.getJSONArray("versions"); 

       // looping through All Versions 
       for (int i = 0; i < versions.length(); i++) { 
        JSONObject c = versions.getJSONObject(i); 

        String name = c.getString("name"); 
        //String version = c.getString("version"); 
        //String released = c.getString("released"); 
        //String api = c.getString("api"); 
        //String image = c.getString("image"); 

        // tmp hash map for single version 
        HashMap<String, String> Version = new HashMap<>(); 

        // adding each child node to HashMap key => value 
        Version.put("name", name); 
        //Version.put("version", version); 
        //Version.put("released", released); 


        // adding Data to version list 
        androidversions.add(Version); 
       } 
      } catch (final JSONException e) { 
       Log.e(TAG, "Json parsing error: " + e.getMessage()); 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         Toast.makeText(getApplicationContext(), 
           "Json parsing error: " + e.getMessage(), 
           Toast.LENGTH_LONG) 
           .show(); 
        } 
       }); 

      } 
     } else { 
      Log.e(TAG, "Couldn't get json from server."); 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        Toast.makeText(getApplicationContext(), 
          "Couldn't get json from server. Check LogCat for possible errors!", 
          Toast.LENGTH_LONG) 
          .show(); 
       } 
      }); 

     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     // Dismiss the progress dialog 
     if (pDialog.isShowing()) 
      pDialog.dismiss(); 
     /** 
     * Updating parsed JSON data into ListView 
     * */ 
     ListAdapter adapter = new SimpleAdapter(
       MainActivity.this, androidversions, 
       R.layout.list_item, new String[]{"name", "version", 
       "released"}, new int[]{R.id.name, 
       R.id.version, R.id.released}); 

     lv.setAdapter(adapter); 
     } 

    } 
} 

列表視圖

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/activity_main" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="www.cobi.co.za.cobiinteractive.MainActivity"> 

<ListView 
    android:id="@+id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" /> 

</RelativeLayout> 

的應用程序看起來像這樣 enter image description here

回答

2

試試這個onPostExecute內,列表視圖的

@Override 
protected void onPostExecute(Void result) { 

    ... 
    lv.setAdapter(adapter); 

    lv.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view,int position, long id) { 
      HashMap<String, String> selected = androidversions.get(position); 
      // pass HashMap using intent 
     } 
    }); 
    } 
} 
+0

非常感謝你,我將如何傳遞數據,它是String name = c.getString(「name」); String version = c.getString(「version」); String released = c.getString(「released」); String api = c.getString(「api」);現在顯示在這個新的活動。 – Pooveshin

+0

@Pooveshin你可以使用額外的捆綁爲:http://stackoverflow.com/questions/768969/passing-a-bundle-on-startactivity# – nbokmans

+0

@Pooveshin檢查編輯。 –

0

使用itemclicklistener和獲取spefic項目的對象散列表列表並傳遞這個對象意圖下一個活動,並在下一個活動中獲取數據包。

0

據我瞭解,你想在列表視圖的整行上設置onClickListener,對吧?

你可以做設置適配器onPostExecute後如下:

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      //You want here to pass the data to another activity 
      Intent intent = new Intent(YOUR_1ST_ACTIVITY_NAME.this, YOUR_2ND_ACTIVITY_NAME.class); 
      intent.putExtra("name",name); 
      intent.putExtra("version",version); 
      intent.putExtra("released",released); 
      intent.putExtra("api",api); 
      YOUR_1ST_ACTIVITY_NAME.this.startActivity(intent); 
     } 
    }); 

,然後在YOUR_2ND_ACTIVITYE,在onCreate

Intent intent = getIntent(); 
    if (intent != null) { 
     String name = intent.getStringExtra("name"); 
     String version = intent.getStringExtra("version"); 
     String released = intent.getStringExtra("released"); 
     String api = intent.getStringExtra("api"); 
     //.... 
    } 

但是,如果你想分配onClickListener該行的視圖中的組件,你可能想閱讀約ListView與定製adpater link

+0

非常感謝您,我將如何傳遞數據,它是String name = c.getString(「name」); String version = c.getString(「version」); String released = c.getString(「released」); String api = c.getString(「api」);現在顯示在這個新的活動。 – Pooveshin

+0

@Pooveshin,檢查答案中的更新 –

+0

當我嘗試這樣做時,它會收到我想要穿過的物品名稱的錯誤。 – Pooveshin

0

更改onCreate方法與此

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    androidversions = new ArrayList<>(); 

    lv = (ListView) findViewById(R.id.list); 
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view,int position, long id) { 
     // create intent and start your second activity 
    } 

}); 
    new GetVersions().execute(); 
} 
0

使用這樣的模式類可以幫助

 public class Version implements Serializable{ 

    public Version(String name, String version, String released) { 
     this.name = name; 
     this.version = version; 
     this.released = released; 
    } 

    private String name; 
    private String version; 
    private String released; 
    private String api; 
    private String image; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getVersion() { 
     return version; 
    } 

    public void setVersion(String version) { 
     this.version = version; 
    } 

    public String getReleased() { 
     return released; 
    } 

    public void setReleased(String released) { 
     this.released = released; 
    } 

    public String getApi() { 
     return api; 
    } 

    public void setApi(String api) { 
     this.api = api; 
    } 

    public String getImage() { 
     return image; 
    } 

    public void setImage(String image) { 
     this.image = image; 
    } 

} 

,並獲取和設置使用構造函數的所有值作爲

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

HashMap<String, String> selected = androidversions.get(position); 
        Version verison = new Version(selected.getString("name"),selected.getString("version"),selected.getString("released")) 
        Intent intent = new Intent(MainActivity.this, DetailActivity.class); 
        intent.putExtra("verisonDetails", verison); 
        startActivity(intent); 
       } 
      }); 

詳細的活動你可以得到

 version = (Version) getIntent().getExtras().getSerializable("verisonDetails"); 

in oncreate()並獲得每個值爲version.get ..