如何在Android中使用SimpleAdapter生成的ListView中制作Button Clickable?

时间:2014-04-06 11:28:06

标签: android listview button simpleadapter

我在Android中使用Listview生成了SimpleAdapter。我在TextViews文件中放置了一些Button和一个Xml,以便这些小部件显示在ListView的行上。我想在ListView中使Button可单击。我不想使用任何BaseAdapterCustomAdapterArrayadapter。任何人都可以建议我如何使用简单的适配器吗?

我的代码如下:

     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 个答案:

答案 0 :(得分:1)

您可以使用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;
    }
};

答案 1 :(得分:0)

这是不可能的。你可以覆盖getView,但是你也可以使用任何其他适配器...... SimpleAdapter只是将字符串映射到视图,没有别的。