我在Android中使用Listview
生成了SimpleAdapter
。我在TextViews
文件中放置了一些Button
和一个Xml
,以便这些小部件显示在ListView的行上。我想在ListView中使Button可单击。我不想使用任何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" />
答案 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只是将字符串映射到视图,没有别的。