复制我只知道一半的其他人的代码,我成功制作了一个listview,每个元素都包含三个TextView和一个CheckBox。
该代码涉及以下两个xml文件。首先" customrowview.xml":
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<LinearLayout
android:layout_width="142dp"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView android:id="@+id/text1"
android:layout_width="match_parent"
android:layout_height="fill_parent"/>
<TextView android:id="@+id/text2"
android:layout_width="match_parent"
android:layout_height="fill_parent"/>
<TextView android:id="@+id/text3"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right" >
<CheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="" />
<Button
android:id="@+id/editbut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Edit" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
然后&#34; customlistview.xml&#34;:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView android:id="@id/android:list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#000fff"
android:layout_weight="2"
android:drawSelectorOnTop="false">
</ListView>
<TextView android:id="@id/android:empty"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFff00"
android:text="No data"
/>
</LinearLayout>
我可以通过以下方式访问该列表:
listView = (ListView) findViewById(R.id.mylist);
该代码还涉及:
SimpleAdapter adapter = new SimpleAdapter(
this,
list,
R.layout.custom_row_view,
new String[] {"label","daysordate","time"},
new int[] {R.id.text1,R.id.text3, R.id.text2}
);
listView.setAdapter(adapter);
现在我想做的是像listView.setlistenerforbuttonwithinlist()!
但无法解决如何做到这一点。我知道之前有关于SO的相关问题,但我无法理解答案: - (
编辑:看到azgolfers回答后......我按如下方式制作了自定义适配器:
public class myadapter extends SimpleAdapter
{
LayoutInflater mLayoutInflater;
public void myadapter(Context context)
{
mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View view = null;
if (convertView != null)
{
view = convertView;
}
else
{
view = mLayoutInflater.inflate(R.layout.custom_row_view, null);
}
Button buttonEdit = (Button) view.findViewById(R.id.editbut);
buttonEdit.setOnClickListener(new OnClickListener()
{
public void onClick(View arg0)
{
Log.i("xx","Button pressed!");
}
});
return super.getView(position, convertView, parent);
}
public myadapter(Context context, List<? extends Map<String, ?>> data,int resource, String[] from, int[] to)
{
super(context, data, resource, from, to);
// TODO Auto-generated constructor stub
}
}
不幸的是,这一行崩溃了
view = mLayoutInflater.inflate(R.layout.custom_row_view, null);
使用空指针异常...不确定原因: - (
答案 0 :(得分:4)
首先,您需要扩展自己的适配器,可能来自ArrayAdapter。 ArrayAdapter有一个名为getView的方法,您需要覆盖该方法并为特定位置的列表视图行提供UI。 e.g。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
if (convertView != null) {
view = convertView;
} else {
view = mLayoutInflater.inflate(R.layout.custom_row_view, null);
}
Button buttonEdit = (Button) view.findViewById(R.id.editbut);
buttonEdit.setOnClickListener(...);
}
在getView()中,由于您正在构建行的UI,因此您有机会在按钮上设置单击处理程序。
此外,您还需要将其添加到Button的xml标记中:
android:focusable="false"
android:focusableInTouchMode="false"
如果不这样,listview中的按钮在按下时不会触发OnClick事件。
答案 1 :(得分:1)
尝试сhange
view = mLayoutInflater.inflate(R.layout.custom_row_view, null);
到
view = mLayoutInflater.inflate(R.layout.custom_row_view, parent, false);
祝你好运!