如何使用列表中的按钮触发Listactivity中的onListItemClick?

Cod*_*ile 89 android android-widget android-listview

我有一个简单的ListActivity,它使用自定义ListAdapter在列表中生成视图.通常ListAdapter只会用TextViews填充视图,但现在我想在那里放一个按钮.

然而,根据我的理解和经验,在列表项中放置可聚焦视图可以防止在单击列表项时在ListActivity中触发onListItemClick().按钮仍然在列表项中正常运行,但是当按下按钮之外的其他内容时,我希望触发onListItemClick.

我怎样才能做到这一点?

Ewo*_*oks 99

正如我在之前的评论解决方案中写的那样是在ImageButton上设置setFocusable(false).

有更优雅的解决方案尝试添加列表元素的android:descendantFocusability="blocksDescendants" 根布局.这将使点击onListItem成为可能,并且你可以单独处理Button或ImageButton点击

希望能帮助到你 ;)

干杯

  • `android:descendantFocusability ="blocksDescendants"`很完美. (3认同)

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" - 只是为了清楚.
问候!

  • 我的解决方案结束了另一种方式.我通过设置列表行布局的后代Focusability属性来阻止后代解决了这个问题,突然它起作用了.现在我使用一个simpleCursorAdapter和一个自定义视图绑定器来进行事件设置和其他与按钮相关的奇特事物. (9认同)
  • 我用过这个解决方案.然而,一个警告:如果你的onClick处理程序引起了列表中的内容发生变化,这将导致getView被调用,如果你的部件是有状态(如切换按钮或复选框),和getView设置一个状态,你可能想setOnClickListener (null)在更改onView中的状态之前,以避免产生循环效果. (3认同)
  • 我的解决方案怎么样?我的印象更优雅,可以在需要时更轻松地应用. (3认同)

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)

  • 我喜欢你的解决方案:如果每行只有一个"可点击"小部件,那么拒绝它们的可聚焦性就是一个优雅的解决方案.它确实意味着行上任何位置的点按都会匹配,但当窗口小部件是收音机或复选框时,这是一种有用的行为.使用android:focusable ="false"和android:focusableInTouchMode ="false"可以在XML中实现相同的目的. (3认同)

小智 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&lt;String&gt;(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

我希望这
对我有帮助......对不起我的英语:(