如何在Android中的Listview中为Button添加事件处理程序?

时间:2016-10-19 02:43:11

标签: android listview button checkbox

我在ListView中的项目是使用PHP生成的,并存储在MySQL数据库中。如何添加与按钮绑定的事件处理函数?我需要的过程是这样的:当您单击按钮时,它将获取该项目并将其保存到其他表格,以及获取当前日期时间。

public class ViewBusFiveStudent extends AppCompatActivity implements ListView.OnItemClickListener {

private ListView listView;
private Button btntime;
private String JSON_STRING;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_view_busfour);
    listView = (ListView) findViewById(R.id.listView);
    listView.setOnItemClickListener(this);

    getJSON();
}


private void showStudents(){
    JSONObject jsonObject = null;
    ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String, String>>();
    try {
        jsonObject = new JSONObject(JSON_STRING);
        JSONArray result = jsonObject.getJSONArray(Config.TAG_JSON_ARRAY);

        for(int i = 0; i<result.length(); i++){
            JSONObject jo = result.getJSONObject(i);
            String id = jo.getString(Config.TAG_ID);
            String name = jo.getString(Config.TAG_NAME);

            HashMap<String,String> student = new HashMap<>();
            student.put(Config.TAG_ID,id);
            student.put(Config.TAG_NAME,name);
            list.add(student);
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }

    ListAdapter adapter = new SimpleAdapter(
            ViewBusFiveStudent.this, list, R.layout.list_items,
            new String[]{Config.TAG_ID,Config.TAG_NAME},
            new int[]{R.id.id, R.id.name});

    listView.setAdapter(adapter);
}

private void getJSON(){
    class GetJSON extends AsyncTask<Void,Void,String>{

        ProgressDialog loading;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            loading = ProgressDialog.show(ViewBusFiveStudent.this,"Fetching Data","Wait...",false,false);
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            loading.dismiss();
            JSON_STRING = s;
            showStudents();
        }

        @Override
        protected String doInBackground(Void... params) {
            RequestHandler rh = new RequestHandler();
            String s = rh.sendGetRequest(Config.URL_GET_BUS_FOUR);
            return s;
        }
    }
    GetJSON gj = new GetJSON();
    gj.execute();
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    Intent intent = new Intent(this, ViewBusFive.class);
    HashMap<String,String> map =(HashMap)parent.getItemAtPosition(position);
    String studId = map.get(Config.TAG_ID).toString();
    intent.putExtra(Config.STUD_ID,studId);
    startActivity(intent);
}
}

这是我的list_view:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

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

<TextView
    android:id="@+id/name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/id"/>

    <CheckBox
        android:id="@+id/checkBoxPres"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:text=""
        android:layout_alignBaseline="@+id/btnTime"
        android:layout_alignBottom="@+id/btnTime"
        android:layout_toLeftOf="@+id/btnTime"
        android:layout_toStartOf="@+id/btnTime" />

    <Button
        android:text="TimeStamp"
        android:layout_width="105dp"
        android:layout_alignParentRight="true"
        android:layout_height="wrap_content"
        android:id="@+id/btnTime" />

</RelativeLayout>

我只是想知道如何定义单击按钮时调用的函数以及我在哪里放置它。

2 个答案:

答案 0 :(得分:0)

通常,在将数据绑定到行时,会在行布局中的子视图上设置单击侦听器。这发生在适配器内部。由于您使用的是框架提供的适配器,因此它没有将单击侦听器添加到行中按钮的逻辑,它只知道如何进行简单绑定(例如将字符串转换为TextView等)。您必须继承SimpleAdapter(或其他内容,如BaseAdapter)并自行添加必要的逻辑。

当您接触它时,我建议您切换到使用RecyclerView而不是ListView。这意味着使用RecyclerView.Adapter而不是您现在使用的那个,这将迫使您无论如何都要实现数据绑定逻辑,这样您就可以将点击侦听器添加到行布局的子视图中。此外,ListView有许多怪癖和特质,包括行具有可聚焦的子视图(如可点击的Button)时的奇怪交互。在这方面RecyclerView对你来说会好得多。

答案 1 :(得分:0)

我已经更改了onitemclick的代码,我可以点击列表视图中的按钮,但只有一个按钮正在工作/可点击。

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    final TextView name1 = (TextView) findViewById(R.id.name);
    btnTime = (Button) findViewById(R.id.btnTime);
    btnTime.setTag(position);
    btnTime.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            BusArrived();
        }

        public void BusArrived() {

            final String name = name1.getText().toString().trim();

            class SendStudent extends AsyncTask<Void, Void, String> {

                ProgressDialog loading;

                @Override
                protected void onPreExecute() {
                    super.onPreExecute();
                    loading = ProgressDialog.show(ViewBusFiveStudent.this, "Saving Dismissal Time...", "Wait...", false, false);
                }

                @Override
                protected void onPostExecute(String s) {
                    super.onPostExecute(s);
                    loading.dismiss();
                    Toast.makeText(ViewBusFiveStudent.this, s, Toast.LENGTH_LONG).show();
                }

                @Override
                protected String doInBackground(Void... v) {
                    HashMap<String, String> params = new HashMap<>();
                    params.put(Config.KEY_STUD_NAME, name);

                    RequestHandler rh = new RequestHandler();
                    String res = rh.sendPostRequest(Config.URL_SAVING_TO_BUS_FIVE_TIME, params);
                    return res;
                }
            }

            SendStudent ae = new SendStudent();
            ae.execute();
        }
    });
}

请在这里纠正我的错误。谢谢!