【问题标题】:How to make a Button Clickable in a ListView generated using a SimpleAdapter in Android?如何在 Android 中使用 SimpleAdapter 生成的 ListView 中使按钮可点击?
【发布时间】:2014-04-06 11:28:05
【问题描述】:

我在 Android 中使用 SimpleAdapter 生成了 Listview。我在Xml 文件中放置了一些TextViewsButton,以便这些小部件显示在ListView 的行上。我想让 Button 在 ListView 中可点击。我不想使用任何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" />

【问题讨论】:

  • 为按钮添加一个 OnClickListener...
  • 不起作用。给力关闭
  • 发布您的适配器代码,@ElDuderino 是正确的。
  • 请检查代码
  • 遇到异常时能不能贴一下logcat?发布整个适配器也会很有用

标签: android listview button simpleadapter


【解决方案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;
    }
};

【讨论】:

    【解决方案2】:

    这是不可能的。您可以覆盖 getView,但随后您也可以使用任何其他适配器...SimpleAdapter 只是将字符串映射到视图,仅此而已。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      • 1970-01-01
      相关资源
      最近更新 更多