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

あなたはかなり近いです。「内側」の setOnClickListener は、リスト行ビュー (ID、名前、アドレス、編集を含むビュー) を作成するときに発生する必要があります。

getView() 中にそれを行うことができます。しかし、クリックをどこに送信するのでしょうか? 新しい onClickListener を作成する代わりに、「this」(アクティビティ) を使用します。アクティビティに onClick() ハンドラを配置します。

次に、クリックを取得すると、onClick メソッドが実行されます。次の問題: どの行がクリックされたかをどのように知ることができますか? 頭に浮かぶ最も簡単な方法は、行ごとに異なる ID をボタンに与えることです。行インデックスを使用します (0 ではなく 1 から開始する必要がある場合があります。注意してください)。

最後に、行 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 に答える