如何从Json字符串动态创建按钮

时间:2019-06-23 19:24:00

标签: java android json

我将URL中的JSON数据解析为一个列表,现在我想为列表中的每个项目创建按钮,但是我不知道该怎么做。我不确定列表是否是最好的主意,但这是我在网上找到的解决方案。

public class SecondActivity extends AppCompatActivity {

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

    private ProgressDialog pDialog;
    private ListView lv;

    private static String url = "https://ggysqqcz.p51.rt3.io/available-remotes/TV";

    ArrayList<HashMap<String, String>> contactList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        contactList = new ArrayList<>();

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

        new GetContacts().execute();

    }


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

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Showing progress dialog
            pDialog = new ProgressDialog(SecondActivity.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 remotes = jsonObj.getJSONArray("remotes");

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

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


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


                        contact.put("id", id);

                        contactList.add(contact);
                    }
                } 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();


            ListAdapter adapter = new SimpleAdapter(

                    SecondActivity.this, contactList,
                  R.layout.list_item, new String[]{"id"}, new int[]{button1});

            lv.setAdapter(adapter);


        }
    }

public void onClickButton1(View view) {
        startActivity(new Intent(getApplicationContext(), ThirdActivity.class));
    }
}

这显示了所有按钮,但是很明显,当我单击它们时,它们都执行相同的操作,因为我只有button1。如何使所有按钮执行不同的活动?

3 个答案:

答案 0 :(得分:2)

我建议您为您的ListView创建一个自定义适配器,该适配器将为您的按钮提供onClick功能,并根据该项目在ListView中的位置,您可以在onClick函数中实施不同的操作。因此,我想建议一个类似以下的适配器。

public class ListAdapter extends ArrayAdapter<Item> {

    private int resourceLayout;
    private Context mContext;
    private ArrayList<Contact> contacts;

    public ListAdapter(Context context, int resource, ArrayList<Contact> contacts) {
        super(context, resource, items);
        this.resourceLayout = resource;
        this.mContext = context;
        this.contacts = contacts;
    }

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

        View v = convertView;

        if (v == null) {
            LayoutInflater vi;
            vi = LayoutInflater.from(mContext);
            v = vi.inflate(resourceLayout, null);
        }

        Item p = getItem(position);

        if (p != null) {
            Button btn = (TextView) v.findViewById(R.id.button1);

            if (btn != null) {
                btn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if(position == 1) implementSomethingFor1();
                        else if (position == 2) implementSomethingFor2();
                        // ... Define the other implementations
                    }
                });
            }
        }

        return v;
    }
}

然后使用如下所示的适配器。

ListView lv = (ListView) findViewById(R.id.list);
ListAdapter customAdapter = new ListAdapter(this, R.layout.list_item, contactList);
lv.setAdapter(customAdapter);

请注意,这不是确切的实现。您应该修改自定义适配器,以使其达到您的目的。

答案 1 :(得分:1)

您有几种选择:

  1. 检查view参数以确定要执行的操作。您可以使用getTag()setTag()在每个按钮上提供自定义数据。

  2. 通过扩展SimpleAdapter创建自定义适配器。覆盖createView()和bindView()以便为每个按钮提供自定义行为,例如向每个按钮添加不同的OnClickListener对象

  3. OnItemClickListener设置为ListView。这提供了一个参数,在该参数中单击了列表视图中的位置。您可以使用它来确定要做什么或将什么数据传递给新活动。您可能需要使用适配器中的getItem()来获取当前行的数据。

答案 2 :(得分:1)

尝试 lv.setonitemclicklisnter,这将创建一个方法,该方法将允许您单击每个项目,您可以在此方法内编写例如Toast消息,因此,当您单击某个项目时,将弹出Toast消息。