您的位置:首页 > 其它

列表项中包含按钮的ListView的点击事件的响应

2015-09-15 15:36 531 查看
ListView
列表项中可以存在按钮,例如如下图所示。



清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="lemon.learnandroid"
android:versionCode="1"
android:versionName="1.0">
<application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
<activity android:name="ListViewActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>


每一项的布局文件(
button_listview_item.xml
):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="显示该项内容"/>
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>


代码:

package lemon.learnandroid;

import android.app.ListActivity;
import android.os.Bundle;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.view.LayoutInflater;
import android.widget.LinearLayout;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.Button;
import android.util.Log;

public class ListViewActivity extends ListActivity
{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
String[] myStringArray = {"第一件事","第二件事","第三件事"};
ThingArrayAdapter adapter = new ThingArrayAdapter(this, R.layout.button_listview_item, myStringArray);
ListView listView = getListView();
listView.setAdapter(adapter);
}

private class ThingArrayAdapter extends ArrayAdapter<String>
{
private int resourceId;

public ThingArrayAdapter(Context context, int resourceId,
String[] things)
{
super(context, resourceId, things);
this.resourceId = resourceId;
}

@Override
public View getView(int position, View convertView,
ViewGroup parent)
{
final String content = getItem(position);

LinearLayout linearLayout = new LinearLayout(getContext());
LayoutInflater layoutInflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
layoutInflater.inflate(resourceId, linearLayout, true);

final TextView tvName =
(TextView)linearLayout.findViewById(R.id.textview);
tvName.setText(content);

Button btn =
(Button)linearLayout.findViewById(R.id.button);
btn.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Toast.makeText(ListViewActivity.this,content,Toast.LENGTH_SHORT).show();
}
});
return linearLayout;
}
}
}


点击按钮会弹出相应列表项的内容,而点击列表项没有反应。这是因为
ListView
ItemClick
事件被按钮的
Click
事件给屏蔽了。



为了解决这个问题,需要对每一项的布局文件进行修改,为顶层的
LinearLayout
RelativeLayout
设置属性
android:descendantFocusability="blocksDescendants"
,为按钮设置属性
android:focusable="false"
,修改后的布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:descendantFocusability="blocksDescendants">
<Button android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="显示该项内容"
android:focusable="false"/>
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>


这时ItemClick事件也可以正常响应了。



参考文献

/article/9256766.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: