【问题标题】:How do I add an event handler to a Button in Listview in Android?如何在 Android 的 Listview 中向按钮添加事件处理程序?
【发布时间】:2017-02-28 11:49:44
【问题描述】:

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>

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

【问题讨论】:

    标签: android listview button checkbox


    【解决方案1】:

    我已经更改了 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();
            }
        });
    }
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 你能给我看一些 RecyclerView 的样本和一个功能按钮吗?我还没有使用 RecyclerView。谢谢
      • @Siegrain 我认为您应该在线查找教程,因为 ListView 和 RecyclerView 之间存在许多重要差异,并且小代码 sn-p 无法做到这一点。
      • RecyclerView 比 ListView 容易吗?我在列表视图中看到有关按钮的教程,但没有人知道答案,因为我在列表视图中的项目在 mysql 中。
      • @Siegrain RecyclerView 更容易,因为您只需在 Button 上放置一个点击侦听器,一切正常。当您有一个项目视图的可聚焦或可点击的子视图时,ListView 是出了名的困难(因为 ListView 在管理其子级的触摸交互方面非常笨拙)。这些都与您的数据来源无关;无论您现在将什么数据用于 ListView,您也可以将其用于您的 RecyclerView。
      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      相关资源
      最近更新 更多