Как сделать Button Clickable в ListView, сгенерированном с помощью SimpleAdapter в Android?

Я сгенерировал Listview используя SimpleAdapter в Android. Я разместил несколько TextViews и Button в Xml файл, чтобы эти виджеты отображались в строке ListView. Я хочу сделать кнопку нажатой в ListView. Я не хочу использовать какие-либо BaseAdapter или же CustomAdapter или Arrayadapter. Кто-нибудь может подсказать мне, как это сделать с помощью простого адаптера?

Мои коды следующие:

     final ListView l=(ListView)findViewById(R.id.listView1);
     ListAdapter k=new SimpleAdapter(this,val1,R.layout.mytask,new String[]{"TaskId","heading","status"},new int[]{R.id.View1,R.id.View2,R.id.ViewStatus});
     Button b=(Button)findViewById(R.id.mytask);
     l.setAdapter(k);

Мой XML-файл выглядит следующим образом:

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

>

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginTop="18dp"
    android:text="Task Name:"

    android:textSize="15dp"
    android:textStyle="bold" />

<TextView
    android:id="@+id/View1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:text="TextView"

    android:textSize="15dp"
    android:textStyle="bold"
    android:visibility="invisible" />

<TextView
    android:id="@+id/View2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/textView1"
    android:layout_alignBottom="@+id/textView1"
    android:layout_marginLeft="31dp"
    android:layout_toRightOf="@+id/textView1"
    android:text="TextView"

    android:textSize="15dp"
    android:textStyle="bold"
    android:visibility="visible" />

<TextView
    android:id="@+id/ViewStatus"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/View2"
    android:layout_alignBottom="@+id/View2"
    android:layout_alignParentRight="true"
    android:text="Pending"

    android:textSize="15dp"
    android:textStyle="bold" />

<TextView
    android:id="@+id/textView2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/ViewStatus"
    android:layout_alignBottom="@+id/ViewStatus"
    android:layout_marginRight="14dp"
    android:layout_toLeftOf="@+id/ViewStatus"
    android:text="Status:"

    android:textSize="15dp"
    android:textStyle="bold" />

<Button
    android:id="@+id/mytask"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/textView1"
    android:text="Button" />

2 ответа

Вы можете использовать SimpleAdapter еще переопределить getView, Вы должны проверить документы о том, как getView работает, как вы пытались сделать это, кажется, вы не очень хорошо понимаете основы адаптера: ваша кнопка будет создана только тогда, когда ListView генерирует различные строки, что в первый раз происходит асинхронно в какой-то момент в будущее после того, как вы установите адаптер.

ListAdapter k=new SimpleAdapter(this,val1,R.layout.mytask,new String[]{"TaskId","heading","status"},new int[]{R.id.View1,R.id.View2,R.id.ViewStatus}) {
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        // get filled view from SimpleAdapter
        View itemView=super.getView(position, convertView, parent);
        // find our button there
        View myTaskButton=itemView.findViewById(R.id.mytask);
        // add an onClickListener
        myTaskButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // your button is pressed on this view  
            }
        });
        return itemView;
    }
};

или, что еще лучше, избегайте создания объектов внутри getView(), поэтому предварительно создайте прослушиватель, который вы будете использовать повторно:

OnClickListener mTaskClickListener=new OnClickListener() {
    @Override
    public void onClick(View v) {
         // your button is pressed on this view, position is stored in tag. 
         Integer positionPressed=(Integer)v.getTag();
    }
};
ListAdapter k=new SimpleAdapter(this,val1,R.layout.mytask,new String[]{"TaskId","heading","status"},new int[]{R.id.View1,R.id.View2,R.id.ViewStatus}) {
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        // get filled view from SimpleAdapter
        View itemView=super.getView(position, convertView, parent);
        // find our button there
        View myTaskButton=itemView.findViewById(R.id.mytask);

        // add an onClickListener, but this time is alredy created and the same for all
        myTaskButton.setOnClickListener(mTaskClickListener);
        myTaskButton.setTag(position); // so we know which tag was pressed
        return itemView;
    }
};

Это невозможно. Вы можете переопределить getView, но затем вы также можете использовать любой другой адаптер... SimpleAdapter - это просто отображение строк в представлении, ничего больше.

Другие вопросы по тегам