2016-11-20 152 views
1

我正在從我的JSON對象/數組中獲得的數據生成按鈕。從API獲取。 目前我有20個循環可以這麼說(20個數據,20個按鈕)。Android Java動態按鈕點擊

該按鈕的XML /佈局是這樣的:

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

目前的代碼來獲取數據,並在我的佈局打印它看起來是這樣的:

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

我的適配器看起來像這樣:

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

} 

我的想法是點擊每個按鈕,並顯示相關數據另一個更詳細的活動。

但我怎樣才能通過一個循環運行並獲得正確的按鈕(id)並創建一個新的活動與其相關的數據。

回答

0

在您的適配器的getView方法中,您可以將onClickLister設置爲該行中的按鈕,該按鈕將引用該行的數據。使用意圖來啓動詳細的活動,並將點擊的項目的數據作爲額外添加。

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

在接收活動,您可以從意向獲取數據:

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

新的OnClickListener給我一個錯誤 – utdev

+0

因此如何從我的MainActivity獲取contactsList到我的Recycler Adpater(對不起,我沒有在android中經驗) – utdev

+0

我目前得到的錯誤是'OnClickListener'' contactsList.get (位置)'和'.getParcelableExtra(「data」)',如果你介意我們也可以把它移動到聊天室 – utdev

0

擴展ArrayAdapter並通過您在構造函數參數,將其聯繫人列表。將該列表分配給ArrayAdapter中的字段,然後在getView()方法中,您可以通過簡單的list.get(position)獲取您的物品。

+0

你可以發佈代碼我有多麼激動我不得不改變它,我沒有在android開發 – utdev

+0

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

+0

在這種情況下ArrayAdapter是否與我的RecyclerAdapter相似? – utdev