2009-10-05 66 views
19

我已经为每一行延长LinearLayout实现了自定义ListView。每行都有一个小缩略图,一个文本和一个check boxlist view正确部署,我可以滚动并通过它没有任何问题。setOnItemClickListener()没有自定义的ListView工作@安卓

ListView似乎并没有给setOnItemClickListener()任何反应,所以我必须在每一行这显然是创设问题中的文本的getView()设置点击听众找到一个解决办法,当我试图重用adapter。有没有人有办法解决吗?

回答

43

试试这个
对于ListView控件,

final ListView list = (ListView) findViewById(R.id.list); 
list.setItemsCanFocus(false); 

此外,请确保复选框内的列表项设置可聚焦假

android:focusable="false" 
android:focusableInTouchMode="false" 
+0

我有同样的问题,上述解决方案适用于在该行检测点击,但我有我的自定义的ListView行2个按钮。我怎么知道哪个按钮被点击了? 谢谢 – longhairedsi 2010-09-10 11:47:53

+0

谢谢!!!你真的帮助我了! – 2013-07-24 06:06:21

+1

@longhairedsi:请将以下代码添加到getView()方法中 button1.setFocusable(false); button2.setFocusable(false); button1.setFocusableInTouchMode(false); button2.setFocusableInTouchMode(false); button1.setOnClickListener(this); button2.setOnClickListener(this); 在您的适配器(或您希望的地方)中实现您的点击监听器按钮 设置列表视图的点击监听器也..... 现在检查您的点击将适用于这两种..... listview至于按钮也 – 2013-09-26 10:34:33

0

你有没有在你的扩展适配器类的任何ViewHolder?如果是,那么在setOnItemClickListener()中创建一个你的占位符的实例,它可能会像这样工作。

@Override 
    protected void onListItemClick(ListView l, View v, int position, long id) {   
     View rowView = v; 
     if (rowView == null) { 
      LayoutInflater inflater = this.getLayoutInflater(); 
       // GET INFLATE OF YOUR LAYOUT. 
      rowView = inflater.inflate(R.layout.projectpeopledescrate, null); 
      // CUSTOM ViewHolder Class Created in Adapter. 
// name,title,comment are my components on the same listview clicked item. 
      PPDViewHolder viewHolder = new PPDViewHolder(); 
      viewHolder.name  = (TextView) rowView.findViewById(R.id.ppeopledescrvname); 
      viewHolder.title = (TextView) rowView.findViewById(R.id.ppeopledescrvtime); 
      viewHolder.comment = (TextView) rowView.findViewById(R.id.ppeoplervcomment); 
      viewHolder.hiddenLayout = (RelativeLayout) rowView.findViewById(R.id.hiddenCommentPanel); 
      rowView.setTag(viewHolder); 
     } 
      // ANOTHER object instance to apply new changes. 
     PPDViewHolder holder = (PPDViewHolder) rowView.getTag(); 
// I've setted up visibility over the components. You can set your onClickListener over your buttons. 
     holder.comment.setVisibility(View.GONE); 
     holder.name.setVisibility(View.GONE); 
     holder.title.setVisibility(View.GONE); 
     holder.hiddenLayout.setVisibility(View.VISIBLE); 
     holder.hiddenLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.MATCH_PARENT)); 
     holder.hiddenLayout.bringToFront(); 

    } 

希望,你想要的东西一样。祝你好运!

11

老答案:previous post here

android:focusable="false" 
android:clickable="false" 

无助的时候ImageButton的是自定义视图中。其中必须使用运行时button.setFocusable(false);(从Java源代码)

编辑:还有更优雅的解决方案。尝试在列表元素的根布局中添加android:descendantFocusability="blocksDescendants"。这将使点击onListItem可能并单独u能处理按钮或点击的ImageButton

0

我有这样的代码

this.mListView.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
       Log.v(TAG,"loul"); 
      } 
     }); 

但它没有工作

,所以我有中庸之道把onItemSelectedListener下,它工作OO:

this.mListView.setItemsCanFocus(false); 
this.mListView.setOnItemClickListener(new OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { 
     Log.v(TAG,"loul"); 
    } 
}); 
//listener for nothing but it allow OnItemClickListener to work 
this.mListView.setOnItemSelectedListener(new OnItemSelectedListener() { 

    @Override 
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 

    } 

    @Override 
    public void onNothingSelected(AdapterView<?> arg0) { 

    } 
}); 
0

设置这些特性:

android:focusable="false" 
android:focusableInTouchMode="false" 

在您list_item.xml文件的所有UI元素。

如果这不是在您的适配器一套解决:

v.imageView.setFocusable(false); 
    v.imageView.setFocusableInTouchMode(false);