Cod*_*ile 89 android android-widget android-listview
我有一个简单的ListActivity,它使用自定义ListAdapter在列表中生成视图.通常ListAdapter只会用TextViews填充视图,但现在我想在那里放一个按钮.
然而,根据我的理解和经验,在列表项中放置可聚焦视图可以防止在单击列表项时在ListActivity中触发onListItemClick().按钮仍然在列表项中正常运行,但是当按下按钮之外的其他内容时,我希望触发onListItemClick.
我怎样才能做到这一点?
Ram*_*mps 59
我希望我能在这里提供帮助.我假设你有listView项目的自定义布局,这个布局包括按钮和其他一些视图 - 比如TextView,ImageView或其他任何东西.现在,您希望在按钮单击时触发不同的事件,并在单击其他所有内容时触发不同的事件.
您可以在不使用ListActivity的onListItemClick()的情况下实现此目的.
这是你要做的:
您正在使用自定义布局,因此可能要从自定义适配器覆盖getView()方法.诀窍是为您的按钮设置不同的侦听器,并为整个视图(您的行)设置不同的侦听器.看看这个例子:
private class MyAdapter extends ArrayAdapter<String> implements OnClickListener {
public MyAdapter(Context context, int resource, int textViewResourceId,
List<String> objects) {
super(context, resource, textViewResourceId, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
String text = getItem(position);
if (null == convertView) {
convertView = mInflater.inflate(R.layout.custom_row, null);
}
//take the Button and set listener. It will be invoked when you click the button.
Button btn = (Button) convertView.findViewById(R.id.button);
btn.setOnClickListener(this);
//set the text... not important
TextView tv = (TextView) convertView.findViewById(R.id.text);
tv.setText(text);
//!!! and this is the most important part: you are settin listener for the whole row
convertView.setOnClickListener(new OnItemClickListener(position));
return convertView;
}
@Override
public void onClick(View v) {
Log.v(TAG, "Row button clicked");
}
}
Run Code Online (Sandbox Code Playgroud)
你的OnItemClickListener类可以在这里声明:
private class OnItemClickListener implements OnClickListener{
private int mPosition;
OnItemClickListener(int position){
mPosition = position;
}
@Override
public void onClick(View arg0) {
Log.v(TAG, "onItemClick at position" + mPosition);
}
}
Run Code Online (Sandbox Code Playgroud)
当然,您可能会向OnItemClickListener构造函数添加更多参数.
还有一件重要的事情 - 上面显示的getView实现非常难看,通常你应该使用ViewHolder模式来避免findViewById调用..但你可能已经知道了.
我的custom_row.xml文件是RelativeLayout,Button为id"button",TextView为id"text",ImageView为id"image" - 只是为了清楚.
问候!
Rab*_*abi 18
当自定义ListView包含可聚焦元素时,onListItemClick将不起作用(我认为这是预期的行为).只需从自定义视图中删除焦点,它就可以解决问题:
例如:
public class ExtendedCheckBoxListView extends LinearLayout {
private TextView mText;
private CheckBox mCheckBox;
public ExtendedCheckBoxListView(Context context, ExtendedCheckBox aCheckBoxifiedText) {
super(context);
…
mText.setFocusable(false);
mText.setFocusableInTouchMode(false);
mCheckBox.setFocusable(false);
mCheckBox.setFocusableInTouchMode(false);
…
}
}
Run Code Online (Sandbox Code Playgroud)
小智 13
我有同样的问题:OnListItemClick没有被解雇![已解决]
这种情况发生在扩展ListActivity的类上,其中ListActivity
的布局将内容TextBox和ListView嵌套到LinearLayout中
,另一个布局用于行(CheckBox和TextBox嵌套到LineraLayout中).
这是代码:
res/layout/configpage.xml(ListActivity的主要内容)
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/selection"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="pippo" />
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:drawSelectorOnTop="false"
android:background="#aaFFaa" >
</ListView>
<LinearLayout>
res/layout/row.xml (layout for single row)
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
**android:focusable="false"**
**android:focusableInTouchMode="false"** />
<TextView
android:id="@+id/testo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
**android:focusable="false"**
**android:focusableInTouchMode="false"** />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
src /.../.../ ConfigPage.java
public class ConfigPage extends ListActivity
{
TextView selection;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.configpage);
// loaded from res/value/strings
String[] azioni = getResources().getStringArray(R.array.ACTIONS);
setListAdapter(new ArrayAdapter<String>(this, R.layout.row,
R.id.testo, azioni));
selection = (TextView) findViewById(R.id.selection);
}
public void onListItemClick(ListView parent, View view, int position, long id)
{
selection.setText(" " + position);
}
}
Run Code Online (Sandbox Code Playgroud)
当我在row.xml上添加时,这开始起作用
android:focusable="false"android:focusableInTouchMode="false"我使用Eclipse 3.5.2
Android SDK 10.0.1
min SDK版本:3
我希望这
对我有帮助......对不起我的英语:(
| 归档时间: |
|
| 查看次数: |
64603 次 |
| 最近记录: |