2016-11-20 4 views
1

Ich erzeuge Schaltflächen aus den Daten, die ich von meinem JSON-Objekt/Array erhalten. Von der API kommen. Momentan habe ich 20 Loops (20 Daten, 20 Buttons).Android Java dynamische Schaltfläche klicken

Die xml/Layout für die Schaltfläche sieht wie folgt aus:

<Button 
     android:id="@+id/details" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 

Zur Zeit der Code die Daten zu erhalten und es in meinem Layout drucken etwas wie folgt aussieht:

public class MainActivity extends AppCompatActivity 
     implements NavigationView.OnNavigationItemSelectedListener { 


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

    private ProgressDialog pDialog; 
    private ListView lv; 

    // URL to get contacts JSON 
    private static String url = "http://192.168.178.32:8888/test/public/index"; 
     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); 
} 

    @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 { 
       // 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; 
    } 

    @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, R.id.release_at}); 

     lv.setAdapter(adapter); 
    } 

Und mein Adapter sieht wie folgt aus:

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> { 

    private List<String> friends; 
    private Activity activity; 

    public RecyclerAdapter(Activity activity, List<String> friends, ArrayList<HashMap<String, String>> contactList) { 
     this.friends = friends; 
     this.activity = activity; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 

     //inflate your layout and pass it to view holder 
     LayoutInflater inflater = activity.getLayoutInflater(); 
     View view = inflater.inflate(android.R.layout.simple_list_item_1, viewGroup, false); 
     ViewHolder viewHolder = new ViewHolder(view); 

     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerAdapter.ViewHolder viewHolder, int position) { 

     viewHolder.item.setText(friends.get(position)); 
    } 

    @Override 
    public int getItemCount() { 
     return (null != friends ? friends.size() : 0); 
    } 

    /** 
    * View holder to display each RecylerView item 
    */ 
    protected class ViewHolder extends RecyclerView.ViewHolder { 
     private TextView item; 

     public ViewHolder(View view) { 
      super(view); 
      item = (TextView) view.findViewById(android.R.id.text1); 
     } 
    } 

} 

Meine Idee auf jedem Knopf klicken und zeigen die bezogenen Daten in eine weitere Aktivität mit mehr Details.

Aber wie kann ich eine Schleife durchlaufen und die richtige Schaltfläche (ID) abrufen und eine neue Aktivität mit den zugehörigen Daten erstellen.

Antwort

0

In der getView-Methode Ihres Adapters können Sie einen onClickLister für die Schaltfläche in dieser Zeile festlegen, die einen Verweis auf die Daten dieser Zeile enthält. Verwenden Sie eine Absicht, um die detaillierte Aktivität zu starten, und fügen Sie die Daten des angeklickten Elements als Extra hinzu.

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    //Inflate your row 

    button.setOnClickListener(new OnClickListener(){ 
     @Override 
     //On click function 
     public void onClick(View view) { 
      HashMap<String, String> item = contactsList.get(position); 
      //Create the intent to start another activity 
      Intent intent = new Intent(view.getContext(), DetailActivity.class); 
      intent.putExtra("data", item); 
      view.getContext().startActivity(intent); 
     } 
    }); 
}); 

In der Empfangs-Aktivität können Sie die Daten aus der Absicht erhalten:

HashMap<String, String> data = getIntent().getExtras().getParcelableExtra("data"); 
+0

neue OnClickListener ist mir ein Fehler – utdev

+0

so wie ich das contactsList von meinem MainActivity in mein Recycler Adpater bekommen (sorry ich bin nicht in android erlebt) – utdev

+0

Die Fehler, die ich zur Zeit bekommen, ist die '' OnClickListener' contactsList.get (Position) 'und' .getParcelableExtra ("Daten") ', wenn Sie etwas dagegen haben, könnten wir dies auch in den Chat verschieben – utdev

0

ArrayAdapter erweitern und Ihre Kontaktliste im Konstruktor Parameter an es übergibt. Weisen Sie diese Liste einem Feld innerhalb ArrayAdapter zu und dann in Ihrer getView() Methode, können Sie Ihren Artikel durch einfaches list.get(position) erhalten.

+0

Könnten Sie den Code, wie excatly muss ich es ändern, ich bin nicht so erfahren in Android Entwicklung – utdev

+0

@utdev [siehe hier] (https://guides.codepath.com/android/Using-an-ArrayAdapter-with-ListView) –

+0

Würde der ArrayAdapter in diesem Fall meinem RecyclerAdapter ähneln? – utdev

Verwandte Themen