【问题标题】:setOnItemClickListener NOT WORKING and setOnItemLongClickListener WORKS in a ListViewsetOnItemClickListener 不工作和 setOnItemLongClickListener 在 ListView 中工作
【发布时间】:2015-01-07 22:23:08
【问题描述】:

我希望有人可以帮助我解决这个问题。我有一个列表视图,我希望列表的每一行都可以点击和长时间点击。 setOnItemLongClickListener 正在工作,但我无法获得可点击的行。我看过这篇帖子ListView with clickable/editable widget 和类似的帖子,但我的行中没有可聚焦的项目,所以我不知道还有什么可能。

这是我在xml中对listView的定义:

<ListView
    android:id="@id/android:list"
    android:textFilterEnabled="true"
    android:layout_width="match_parent"
    android:fadeScrollbars="false"
    android:layout_height="0dp"
    android:layout_weight="1" >
</ListView>

这是我的行的定义(有点丑):

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:stretchColumns="1"
android:longClickable="true"
android:descendantFocusability="blocksDescendants">


<TableRow
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="10dp"
    android:layout_marginTop="10dp"

    tools:ignore="UselessParent" >

    <LinearLayout 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <ImageView
             android:id="@+id/imageViewAgenda"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:contentDescription="@string/historicos"
             android:src="@android:drawable/ic_menu_agenda" />

        <LinearLayout 
            android:orientation="horizontal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/avisoVerdeFilaHist"
                android:textIsSelectable="false"
                style="@style/CuadroNotificacion"
                android:background="@drawable/borde_blanco"/>

            <TextView
                android:id="@+id/avisoRojoFilaHist"
                android:textIsSelectable="false"
                style="@style/CuadroNotificacion"
                android:background="@drawable/borde_blanco"/>

        </LinearLayout>
    </LinearLayout>
    <LinearLayout 
        android:id="@+id/linearLayoutTarea"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <LinearLayout 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/textViewTarea"
                android:textIsSelectable="false"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textStyle="bold"
                android:layout_marginRight="5dp"
                android:text="@string/tarea2"/>

            <TextView
                android:id="@+id/textViewTitulo"
                android:textIsSelectable="false"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Titulo"/>

        </LinearLayout>

        <TableLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:stretchColumns="0,1">

            <TableRow
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <TextView
                    android:id="@+id/textViewFil1Col1"
                    android:textIsSelectable="false"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="f1c1"/>

                <TextView
                    android:id="@+id/textViewFil1Col2"
                    android:textIsSelectable="false"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="f1c2"/>

            </TableRow>
            <TableRow
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <TextView
                    android:id="@+id/textViewFil2Col1"
                    android:textIsSelectable="false"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="f2c1"/>

                <TextView
                    android:id="@+id/textViewFil2Col2"
                    android:textIsSelectable="false"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="f2c2"/>

            </TableRow>
        </TableLayout>
    </LinearLayout>

</TableRow>
</TableLayout>

如果您想知道为什么我使用 tableLayout 是因为 android:stretchColumns="1" 属性。 请注意,我使用的是 android:descendantFocusability="blocksDescendants"。 以防万一。

这是我的自定义光标适配器:

public class ListaTareasCursorAdapter extends SimpleCursorAdapter implements Filterable{

private Context context;
private int layout;
private String[] from;
private int[] to;
private FragmentManager fragmentManager;


public ListaTareasCursorAdapter(Context context, int layout, Cursor c,
        String[] from, int[] to, int flags, FragmentManager fragmentManager) {

    super(context, layout, c, from, to, flags);

    this.context = context;
    this.layout = layout;
    this.from = from;
    this.to = to;
    this.fragmentManager=fragmentManager;
}


@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {

    LayoutInflater inflater = LayoutInflater.from(context);
    View v = inflater.inflate(layout, parent, false);

    return v;
}

@Override
public void bindView(View v, Context context, Cursor cursor) { 

    //Columna de la BD que queremos recuperar
    String columna = null;

    //Indice de la columna de BD 
    int nombreCol = 0;

    //Resultado de obtener el indice de la columna de BD 
    String nombre = null;

    //Nombre del textView en nuestro Layout donde queremos
    //que aparezca el resultado.
    TextView nombre_text = null;


    String nombreCompleto = ""; //almacena nombre completo del empleado
    String fechaCompleta = ""; //almacena fecha y hora
    String nombreTarea = ""; //almacena nombre de la tarea

    //Para cada valor de la BD solicitado, lo mostramos en el text view.
    for (int i=0; i<from.length; i++){
        columna = from[i];
        nombreCol = cursor.getColumnIndex(columna);
        nombre = cursor.getString(nombreCol);

        if(nombre==null){
            nombre = "--";
        }

        if(columna.equals(Tarea.NOMBRE)){
            nombreTarea = nombre;
        }

        if(columna.equals(Tarea.NOMBRE_EMPLEADO)){
            nombreCompleto = nombre;
        }

        if(columna.equals(Tarea.APELLIDO_EMPLEADO)){
            nombreCompleto = nombreCompleto + " " + nombre;
            nombre = nombreCompleto;
        }

        if(columna.equals(Tarea.FECHA)){
            fechaCompleta = "Pautado: " +nombre;
        }

        if(columna.equals(Tarea.HORA)){
            fechaCompleta = fechaCompleta + " " + nombre;
            nombre = fechaCompleta;
        }


        if(columna.equals(Tarea.FECHA_FINALIZACION)){
            nombre = "Finalizado: " + nombre;
        }

        nombre_text = (TextView) v.findViewById(to[i]);
        if (nombre_text != null) {
            nombre_text.setText(nombre);
        }
    }

}
}

这里是我给听众打电话的地方:

public class TareasActivity extends ListFragment{
....


        ListView lvTareas = (ListView) view.findViewById (android.R.id.list);


        final ListaTareasCursorAdapter listCursorAdapterTareas = new ListaTareasCursorAdapter(context, R.layout.activity_fila_tarea, mCursorTareas, from, to, 0,this.getFragmentManager());
        lvTareas.setAdapter(listCursorAdapterTareas);
        lvTareas.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> arg0, View arg1,
                    int pos, long id) {
                // TODO Auto-generated method stub

                Log.v("CLICK","pos"+" "+pos);


            }
        }); 

        lvTareas.setOnItemLongClickListener(new OnItemLongClickListener() {

            public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                    int pos, long id) {
                // TODO Auto-generated method stub

                Log.v("long clicked","pos"+" "+pos);
                return true;


            }
        }); 

}

一定有一些愚蠢的东西我错过了。

任何想法将不胜感激,感谢阅读。

更多信息:我不知道这是否有用,但我正在使用 TabHost。

【问题讨论】:

    标签: android android-listview


    【解决方案1】:

    您需要重写 ListFragment 中的 onListItemClick 方法,而不是使用 onItemClick。你不需要调用 setOnItemClickListener。

    onListItemClick

    【讨论】:

    • 好的,我删除了 lvTareas.setOnItemClickListener(...);并被覆盖:onListItemClick(ListView l, View v, int position, long id)。但什么也没发生:s。
    • 好的,我成功了,部分感谢你。你的解决方案很好,但我没有得到它,因为 android:longClickable="true"。我改为 android:clickable="false"。我不知道为什么会这样,如果您对此有答案,我会完全正确地接受您的答案。
    • 您需要覆盖它并将 android:descendantFocusability="blocksDescendants" 放入您的根元素(您的 listView 项目所在的主布局)
    【解决方案2】:

    原来我的问题在于我的行的 TableLayout 定义中的 android:longClickable="true"。我改为 android:clickable="false"。并按照@yyunikov 的建议覆盖了 onListItemClick 方法。现在我有:

    myRow.xml

    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:stretchColumns="1"
    android:clickable="false"
    android:descendantFocusability="blocksDescendants">
    
    
    <TableRow
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="10dp"
    android:layout_marginTop="10dp"
    
    tools:ignore="UselessParent" >
    
    ....
    
    </TableRow>
    </TableLayout>
    

    在我的 ListFragment 中:

    public class TareasActivity extends ListFragment{
    

    ....

        ListView lvTareas = (ListView) view.findViewById (android.R.id.list);
    
    
        final ListaTareasCursorAdapter listCursorAdapterTareas = new ListaTareasCursorAdapter(context, R.layout.activity_fila_tarea, mCursorTareas, from, to, 0,this.getFragmentManager());
        lvTareas.setAdapter(listCursorAdapterTareas);
    
    
        lvTareas.setOnItemLongClickListener(new OnItemLongClickListener() {
    
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                    int pos, long id) {
                // TODO Auto-generated method stub
    
                Log.v("long clicked","pos"+" "+pos);
                return true;
    
    
            }
        }); 
    
    }
    
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // TODO Auto-generated method stub
        super.onListItemClick(l, v, position, id);
        Object a = getListView().getItemAtPosition(position);
         Log.v("clicked","pos"+" "+position);
    
    }
    

    现在,当我单击或长按一行时,我会正确调用。我从ListFragment OnListItemClick ignoring me, Not focusable views 找到了这个想法

    【讨论】:

      【解决方案3】:

      不要使用 onItemClick,而是为您的 ListView 尝试 OnItemSelectedListener。我必须在我的项目中做类似的事情并且遇到类似的问题,这就是我能够解决它的方法。 这是一些我知道可以工作的示例代码,可能会对您有所帮助。

      lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
      
                      @Override
                      public void onItemClick(AdapterView<?> arg0, View arg1,
                              int position, long arg3) {
      
                          Object selected = lv.getItemAtPosition(position);
                          Log.e("DEBUG", selected.toString())
                      }
      
                  });
      

      【讨论】:

      • 我按照你的建议做了:lvTareas.setOnItemSelectedListener(new OnItemSelectedListener() { Override public void onItemSelected(AdapterView> arg0, View arg1,int arg2, long arg3) { Log.v("CLICK ","pos"); } 覆盖 public void onNothingSelected(AdapterView> arg0) {}});什么都没有..
      【解决方案4】:

      对我来说,它可以添加

      android:descendantFocusability="blocksDescendants"
      

      row_list.xml 的父标签中。在我的row_list.xml 中有切换按钮。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-07
        相关资源
        最近更新 更多