【问题标题】:setOnItemClickListener doesn't worksetOnItemClickListener 不起作用
【发布时间】:2014-05-28 17:28:08
【问题描述】:

我有一个带有适配器的列表视图,但是当我单击列表视图时没有响应。我已经尝试过其他帖子的一些回复,例如setOnItemClickListener Not Working In Custom ListviewAndroid - setOnItemClickListener event of ListView not working in Fragment,但我无法解决问题。我给你看我的代码。

一、mainActivity

public class MyListActivity extends ListActivity {

private MainView view;

public void onCreate(Bundle icicle) {
super.onCreate(icicle);

   Bundle b=this.getIntent().getExtras();
   String[] array=b.getStringArray("listaEventos");

   /**A continuación, generamos los distintos valores que ocuparán el LinearLayout, concretamente
    * las categorías de los eventos.
    */

   String[] values = new String[] { "Actividades vacacionales", "Aire libre y excursiones", "Cine",
    "Conferencias y otros", "Congresos y jornadas", "Cursos y talleres", "Deporte", "Escénicas",
    "Exposiciones", "Ferias", "Fiestas y festivales", "Música", "Viajes", "Otras" };

   /**
    * Llamamos al adapter personalizado para mostrar la vista.
    */
   MyListCategoryArrayAdapter adapter = new MyListCategoryArrayAdapter(this, values, array);
   setListAdapter(adapter);

   //Log.d("YA SE HA ADAPTADO", "YA SE HA ADAPTADO");

   view = (MainView)View.inflate(this, R.layout.all_products, null);
   //view.setViewListener(viewListener);
   setContentView(view);

}

然后,adapterActivity:

public class MyListCategoryArrayAdapter extends ArrayAdapter<String> {
private final Context context;
private final String[] values;
private final String[] listanumber2;

public MyListCategoryArrayAdapter(Context context, String[] values, String[]   listanumber) {
super(context, R.layout.rowlayout, values);
this.context = context;
this.values = values;
this.listanumber2 = listanumber;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

  if(convertView==null){

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.rowlayout, parent, false);
  }
        ImageView imageView = (ImageView) convertView.findViewById(R.id.icon);
        TextView textView = (TextView) convertView.findViewById(R.id.label);
        TextView textView2 = (TextView) convertView.findViewById(R.id.number);

        textView.setText(values[position]);

        String categoria = values[position];

        if (categoria.startsWith("Actividades vacacionales")) {
            imageView.setImageResource(R.drawable.pic_vacaciones);
            textView2.setText(listanumber2[0].trim()+" eventos");
        }
        if (categoria.startsWith("Aire libre y excursiones")) {
            imageView.setImageResource(R.drawable.pic_aire_libre_excursiones);
            textView2.setText(listanumber2[1].trim()+" eventos");
        }
        if (categoria.startsWith("Cine")) {
            imageView.setImageResource(R.drawable.pic_cine);
            textView2.setText(listanumber2[2].trim()+" eventos");
        }
        if (categoria.startsWith("Conferencias y otros")) {
            imageView.setImageResource(R.drawable.pic_conferencias);
            textView2.setText(listanumber2[3].trim()+" eventos");
        }
        if (categoria.startsWith("Congresos y jornadas")) {
            imageView.setImageResource(R.drawable.pic_congresos_jornadas);
            textView2.setText(listanumber2[4].trim()+" eventos");
        }
        if (categoria.startsWith("Cursos y talleres")) {
            imageView.setImageResource(R.drawable.pic_curso_taller);
            textView2.setText(listanumber2[5].trim()+" eventos");
        }
        if (categoria.startsWith("Deporte")) {
            imageView.setImageResource(R.drawable.pic_deporte);
            textView2.setText(listanumber2[6].trim()+" eventos");
        }
        if (categoria.startsWith("Escénicas")) {
            imageView.setImageResource(R.drawable.pic_escenicas);
            textView2.setText(listanumber2[7].trim()+" eventos");
        }
        if (categoria.startsWith("Exposiciones")) {
            imageView.setImageResource(R.drawable.pic_exposiciones);
            textView2.setText(listanumber2[8].trim()+" eventos");
        }
        if (categoria.startsWith("Ferias")) {
            imageView.setImageResource(R.drawable.pic_ferias);
            textView2.setText(listanumber2[9].trim()+" eventos");
        }
        if (categoria.startsWith("Fiestas y festivales")) {
            imageView.setImageResource(R.drawable.pic_fiesta_festival);
            textView2.setText(listanumber2[10].trim()+" eventos");
        }
        if (categoria.startsWith("Música")) {
            imageView.setImageResource(R.drawable.pic_musica);
            textView2.setText(listanumber2[11].trim()+" eventos");
        }
        if (categoria.startsWith("Viajes")) {
            imageView.setImageResource(R.drawable.pic_viajes);
            textView2.setText(listanumber2[12].trim()+" eventos");
        }
        if (categoria.startsWith("Otras")) {
            imageView.setImageResource(R.drawable.pic_otros);
            textView2.setText(listanumber2[13].trim()+" eventos");
        }
  return convertView;



}

然后,我用来捕捉用户交互的视图:

    /**
 * Find our references to the objects in the xml layout
 */
@Override
protected void onFinishInflate() {
    super.onFinishInflate();

    final ListView list = (ListView)findViewById(android.R.id.list);
    list.setItemsCanFocus(false);
    list.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1,
                int position, long arg3) {
            Log.d("HERE IT DOES NOT ENTER", "HERE IT DOES NOT ENTER");
        }
    });


  final Button button0 = (Button)findViewById(R.id.button1);
    button0.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            Log.d("Boton0000", "Boton0000");

        }
    });
  final Button button1 = (Button)findViewById(R.id.button2);

  button1.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            Log.d("Boton1111", "Boton1111");

        }
  }); 

    final Button button2 = (Button)findViewById(R.id.button3);
    button2.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            Log.d("Boton2222", "Boton2222");

        }
    }); 

    final Button button3 = (Button)findViewById(R.id.button4);
    button3.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            Log.d("Boton3333", "Boton3333");

        }
    }); 
}

最后,我展示了 listView 和列表每一行的 .xml:

all.products.xml

<?xml version="1.0" encoding="utf-8"?>
<com.agendajovenzgz.view.MainView  
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:clickable="false"
>
<ListView
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="389dp"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:focusable="true"  />


<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:text="Mapa" />

<Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_toRightOf="@+id/button1"
    android:text="Lista" />

<Button
    android:id="@+id/button3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_toRightOf="@+id/button2"
    android:text="Buscador" />

<Button
    android:id="@+id/button4"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true"
    android:layout_toRightOf="@+id/button3"
    android:text="Más" />
 </com.agendajovenzgz.view.MainView>

rowlayout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" 
android:padding="6dip"

 >

<ImageView
    android:id="@+id/icon"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:layout_alignParentTop="true"
    android:layout_marginRight="6dip"
    android:src="@drawable/ic_launcher"
    android:focusable="false"
    android:focusableInTouchMode="false"
    />

<TextView
    android:id="@+id/label"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_marginTop="6dip"
    android:layout_toRightOf="@id/icon"
    android:gravity="center"
    android:textStyle="bold"
    android:focusable="false" 
    android:focusableInTouchMode="false"/>

<TextView
    android:id="@+id/number"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"  
    android:layout_toRightOf="@id/icon"
    android:layout_alignParentRight="true"
    android:layout_alignParentBottom="true"
    android:layout_below="@id/label"
    android:layout_alignWithParentIfMissing="false"      
    android:gravity="center"
    android:textSize="12dp"
    android:focusable="false"
    android:focusableInTouchMode="false" />

 </RelativeLayout>

有人可以帮帮我吗?

提前致谢。

问候。

【问题讨论】:

  • 尝试删除list.setItemsCanFocus(false)部分
  • 尝试在方法getView内的每个convertview上设置clicklistener
  • zgz7009 - 行为是相同的。没有什么变化。 Olayinka - 我已经证明了 convertView.setClickable(true);和 convertView.setOnClickListener(null);我不知道你是否参考了这个。结果是我无法点击列表视图。在更改之前,我可以单击,我知道因为该行是用其他颜色选择的。当我点击时,设置 clicklistener 没有任何反应。
  • 试试this way.我希望你能得到帮助。

标签: android listview listener


【解决方案1】:

您应该在扩展的 ListActivity 中覆盖 onListItemClick。

【讨论】:

  • 是的,注意扩展 ListActivity。从 Activity 扩展也是一种可能的解决方案。
【解决方案2】:

尽量不要使用 ListView。在 android 中用某个名称命名列表视图:

android:id="@+id/my_list"

然后在您的 MainActivity 中引用它:

ListView myList = (ListView) findViewById(R.id.my_list);

然后您可以将 myList 设置为 onItemClickListener

myList.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick (AdapterView<?> parent, View view, int position, long id) {

             // Your code here

    }
});

您不必担心后膨胀,因为在 ListView 膨胀之前不会有任何项目可供用户点击。在不使用 ListActivity 的情况下,您可以摆脱 onFinishInflate() 和对其父级的调用,只需将所有点击侦听器放入您的 onCreate() 方法中。

另外,另一个提示 - 在 onCreate() 方法之外声明变量并在 onCreate() 方法的开头定义它们。这将使它们在 Activity 中全局化,因此您不需要 final 关键字。

【讨论】:

    【解决方案3】:

    ListActivity 中,onContentChanged 做了各种事情,包括设置自己的OnItemClickListener

    这个OnItemClickListener 调用ListActivity 中的onListItemClick 方法。

    因此,要使其正常工作,您需要

    • 使用onListItemClick 而不是设置OnItemClickListener
    • 设置OnItemClickListener after你调用了setContentView(可能在onAttachedToWindow,应该发生在之后,但我没有测试过)。

    【讨论】:

      【解决方案4】:

      尝试将所有 textview 的 clickable 属性设置为 false。

      android:clickable="false"

      【讨论】:

        【解决方案5】:

        Activity#onCreate() 期间将OnItemClickListener 设置为ListView

        // inside activity
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // calls to super and setcontentview
        
            listView = (ListView) findViewById(android.R.id.list);
            listView.setOnItemClickListener(new OnItemClickListener() { ...... 
        

        【讨论】:

        • 这对我有用,但这样我在主活动中有 listview 监听器,在视图中有四个按钮监听器。我的目标是让所有的听众都在视图中,以便更好地划分代码
        • 你不应该嵌套视图,除非它们是像 LinearLayout 这样的容器。是的,你可以,但你不应该。将所有监听器声明移动到Activity#onCreate()
        猜你喜欢
        • 1970-01-01
        • 2017-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多