0

在 ListView 上练习时,我还想给它添加按钮,而不是只显示内容。但在我的实现中,按钮根本不做任何事情

另外,我很困惑是否可以点击按钮的位置。现在,我只是在意图中发送在 OnItemClick 中声明的 toSend。

listView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            // TODO Auto-generated method stub
            final int toSend = position;
            TextView refId = (TextView)view.findViewById(R.id.list_id);
            TextView refName = (TextView)view.findViewById(R.id.list_name);
            TextView refAdd = (TextView)view.findViewById(R.id.list_address);
            Button edit = (Button)view.findViewById(R.id.edit);
            edit.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View view) {
                    // TODO Auto-generated method stub
                    Intent i = new Intent(ListActivity.this, EditLayout.class);
                    i.putExtra("position", toSend);
                    startActivity(i);
                }
            });
            String sd_id = refId.getText().toString();
            String sd_name = refName.getText().toString();
            String sd_add = refAdd.getText().toString();
            buildAlert(sd_id, sd_name, sd_add);
        }
    });
4

1 回答 1

1

你很接近。当您创建列表行视图(包含 id、名称、地址、编辑的视图)时,需要发生“内部”setOnClickListener。

您可以在 getView() 期间执行此操作。但是将点击发送到哪里?不要创建新的 onClickListener,而是使用“this”(您的活动)。在活动中放置一个 onClick() 处理程序。

然后,当您获得点击时,将执行 onClick 方法。下一个问题:你怎么知道点击了哪一行?想到的最简单的方法是为每一行的按钮提供不同的 id - 使用行索引(您可能需要从 1 而不是 0 开始 - 被警告)。

最后,给定行 ID,很容易开始您的“嵌套”活动。

希望这可以帮助。

(稍后添加)我这样做;你需要为你的行视图定义一个布局:

class MyActivity extends Activity implements View.OnClickListener
{
  public void onCreate (Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView (R.layout.my_page);

    ListView list = (ListView)findViewById (android.R.id.list);
    MyArrayAdapter adapter = new MyArrayAdapter (this, <your array of data>);
    list.setAdapter (adapter);
  }

  @Override
  public void onClick(View v)
  {
    int buttonId = v.getId();
    if (buttonId is within range)
      ... do what you need to do with the click ...
  }

  private class MyArrayAdapter extends ArrayAdapter<MyData>
  {
    private Activity act;

    //-----------------------------------------------------------------------------
    public MyArrayAdapter (Activity act, MyData array)
    {
      super (act, R.layout.list_row, array);
      this.act = act;
    }

    //-----------------------------------------------------------------------------
    @Override
    public View getView (int position, View convertView, ViewGroup parent)
    {
      ViewGroup rowView = (ViewGroup)convertView;
      if (rowView == null)
      {
        LayoutInflater inflater = act.getLayoutInflater();
        rowView = (ViewGroup) inflater.inflate (R.layout.list_row,
                                                parent, false);
      }

      Button button = (Button)rowView.findViewById (R.id.is_member);
      button.setId (position+1); // add one to avoid 0 as an id.
      button.setOnClickListener (act);

      // set field values here -- not shown

      return rowView;
    }
  }
}
于 2013-11-15T00:15:47.660 回答