2016-11-28 6 views
0

Ich bekomme mein Json-Objekt/Array von meinem Api und drucke es in meine Ansicht, Foreach-Array Ich drucke die ID den Namen in meiner MainActivity.Anzeige von Daten in der Ansicht (Aktivität) bei Klick

Foreach Array-Daten Ich erstelle eine Schaltfläche. Ich möchte zu einer anderen Aktivität wechseln und die zugehörigen Daten des aktuellen Arrays anzeigen.

Meine Ansicht sieht etwa so aus:

________________________ 
id  name  button  <- if one clicks on the button another activity shall show the description of it 
________________________ 

Meine große Frage ist, wie die zugehörigen Daten in einer anderen Aktivität zu zeigen.

Mein MainActivity sieht wie folgt aus:

public class MainActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener { 


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

    private ProgressDialog pDialog; 
    private ListView lv; 

    // URL to get contacts JSON 
    private static String url = "http://192.168.178.58:8888/test"; 

    ArrayList<HashMap<String, String>> contactList; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     contactList = new ArrayList<>(); 

     new GetContacts().execute(); 

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

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show(); 
      } 
     }); 

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
       this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
     drawer.setDrawerListener(toggle); 
     toggle.syncState(); 

     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
     navigationView.setNavigationItemSelectedListener(this); 

    } 

    /** 
    * Async task class to get json by making HTTP call 
    */ 
    private class GetContacts extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      // Showing progress dialog 
      pDialog = new ProgressDialog(MainActivity.this); 
      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); 

      if (jsonStr != null) { 
       try { 
        // Getting JSON Array node 
        JSONArray jsonArray = new JSONArray(jsonStr); 

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

         String id = c.getString("id"); 
         String name = c.getString("name"); 
         String description = c.getString("description"); 

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

         // adding each child node to HashMap key => value 
         data.put("id", id); 
         data.put("name", name); 
         data.put("description", description); 

         // adding contact to contact list 
         contactList.add(data); 
        } 
       } 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; 
     } 

     /** 
     * In onPostExecute() method the progress dialog is dismissed and the array list data is displayed in list view using an adapter. 
     * @param result 
     */ 
     @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, contactList, 
        R.layout.list_item, 
        new String[]{"name", "description"}, 
        new int[]{R.id.name, R.id.description}); 

      lv.setAdapter(adapter); 
     } 

    } 

} 

Edit:

das ist, wie ich eine Absicht gemacht:

public void openDetails() { // button onclick name 
    Intent myIntent = new Intent(MainActivity.this, DetailActivity.class); 
    myIntent.putExtra("key", value); 
    MainActivity.this.startActivity(myIntent); 
} 
+0

Wo genau sind die Tasten, die Sie klicken werden? Wie beginnst du mit der nächsten Aktivität? –

+0

Ich habe die Schaltfläche in meinem XML hinzugefügt Ich habe eine Absicht verwendet, um zu der anderen Aktivität zu gehen, die funktionierte, aber ich konnte die zugehörigen Daten nicht abrufen – utdev

+0

Ich sehe hier keine Methoden, die 'startActivity' aufrufen –

Antwort

1

Im Allgemeinen Sie einen Singleton verwenden können, nicht primitive Daten gemeinsam nutzen zwischen Aktivitäten.

so etwas,

public class MyData { 
    private Object data; 
    public Object getData() { 
    return data; 
    } 
    public void setData(Object data) { 
    this.data = data; 
    } 

    private static final MyData myData = new MyData(); 
    public static MyData getInstance() { 
    return myData; 
    } 
} 

dann in der ersten Aktivität:

MyData.getInstance().setData(objToShare); 

und in der zweiten:

objShared = MyData.getInstance().getData(); 
//do something 
+0

Ich nicht ruhig bekommen, wie ich das in meinem Fall verwenden sollte – utdev

+0

Von dem, was ich verstanden habe, wollen Sie Daten zwischen der Haupttätigkeit und eine zweite zu teilen. Wenn Sie die Antwort von der API erhalten, können Sie die Daten in einem Singleton ablegen und dem obigen Beispiel folgen. – Karim

+1

In einigen Fällen verwende ich nur die 'Application'-Klasse (vorausgesetzt, Sie überschreiben es), um solche Dinge zu speichern. – ygesher

0

Ihre aktuelle Implementierung nicht weiß, welche Taste war geklickt. Alle Schaltflächen haben dasselbe Klickereignis.

Lösung - setzen Sie keine Tasten auf Ihren ListView. Übernehmen Sie einfach einen Klick auf die "Zeile".

Um dies zu starten, sollten Sie Ihre Liste von HashMap<String, String> zugunsten einer benutzerdefinierten POJO-Klasse ersetzen.

See - Parcelable objects

public class Contact implements Parcelable { 
    private String id, name, description; 

    // TODO: Getters & setters 
    // TODO: Actually implement Parcelable 
} 

Dann aktualisieren Sie Ihren Adapter. Anstelle von SimpleAdapter.

See - Custom Adapter

private ContactAdapter adapter; // Top of class 
... 
// onCreate 
    contactList = new ArrayList<Contact>(); 
    lv = (ListView) findViewById(R.id.list); 
    adapter = new ContactAdapter(MainActivity.this, contactList); 
    lv.setAdapter(adapter); // Set this here, not in the AsyncTask 
... 
// doInBackground 
    contactList.add(someContact); 
    // adapter.add(someContact); // Can also do this 
// onPostExecute 
    adapter.notifyDataSetChanged(); // Refresh the adapter, don't lv.setAdapter again. 

Und Ihre AsyncTask

// tmp object for single contact 
    Contact c = new Contact(); 

    // adding each child node to object 
    c.setID(id); 
    c.setName(name); 
    c.setDescription(description); 

    // adding contact to contact list 
    contactList.add(c); 

Gson würde dabei helfen, wenn Sie es nicht manuell tun wollen. Retrofit könnte Ihre gesamte AsyncTask ersetzen, aber ich überlasse es Ihnen, zu recherchieren.


Jetzt zurück zum "Click Event".
Da dies Contact Objekt ist Parcelable, übergeben Sie es durch eine Absicht wie alles andere auch.

Ich mag es, separate Methoden zu definieren, um den Code klarer zu machen.

private void displayContact(Contact c) { 
    Intent intent = new Intent(); 
    intent.putExtra("contact", c); // The piece you're looking for 
    startActivity(intent); 
} 

Um es von der Absicht in einer anderen Tätigkeit zu erhalten:

Contact c = getIntent().getExtras().getParcelable("contact"); 

Siehe - Android: How to pass Parcelable object to intent and use getParcelable method of bundle?

+0

angezeigt bekommen Vielen Dank, ich werde das ausprobieren und Ihnen eine Antwort geben – utdev

+0

Wie excatly verwende ich Parcelable Objects Ich kämpfe dort gerade – utdev

+0

Hast du die Links gelesen, die ich zur Verfügung gestellt? Mit welchem ​​Teil bist du festgefahren? –

Verwandte Themen