onListItemClick 不适用于我的 ListView

onListItemClick doesnt work with my ListView

我尝试用我的字符串数组中的可点击字符串创建一个列表。 通过单击任何字符串,我想得到一个以该字符串命名的 classes。 我尝试使用 onListItemClick...但它不起作用 :S .. 对解决方案有什么建议吗?

感谢您的宝贵时间:)

我有一些字符串,例如 "Title 1"、"Title 2" 和每个标题下的一些描述 "Description 1"、"Description 2"... 在 ListView 中.通过单击 "title",我想进入一个名为 Title 的 class。如何用我的结构做到这一点?

列表视图

标题 1 说明 1

标题 2 说明 2

标题 3 说明 3

列表视图结束

package com.example.benice;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class Main extends Activity implements OnClickListener {

    String[] titles; // String Array
    String[] beschreibung; // String Array
    ListView list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Automatisch generierter Methodenstub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview);
        Resources res = getResources();
        titles = res.getStringArray(R.array.titles);
        beschreibung = res.getStringArray(R.array.beschreibung);

        list = (ListView) findViewById(R.id.listView1);
        VivzAdapter adapter = new VivzAdapter(this, titles, beschreibung);
        list.setAdapter(adapter);
    }

    protected void onListItemClick(ListView l, View v, int position, long id) {
        // TODO Automatisch generierter Methodenstub
        onListItemClick(l, v, position, id);
        String cheese = titles[position];
        try {
            Class ourClass = Class.forName("com.example.benice." + cheese);
            Intent ourIntent = new Intent(Main.this, ourClass);
            startActivity(ourIntent);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onClick(View v) {
        // TODO Automatisch generierter Methodenstub

    }

}

class VivzAdapter extends ArrayAdapter<String> {
    Context context;
    String[] titlesArray;
    String[] beschreibungArray;

    VivzAdapter(Context c, String[] titles, String[] beschreibung) {

        super(c, R.layout.single_row, R.id.titleTextView, titles);

        this.context = c;
        this.titlesArray = titles;
        this.beschreibungArray = beschreibung;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflator = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row = inflator.inflate(R.layout.single_row, parent, false);

        TextView titles = (TextView) row.findViewById(R.id.titleTextView);
        TextView beschreibung = (TextView) row.findViewById(R.id.beschTextView);

        titles.setText(titlesArray[position]);
        beschreibung.setText(beschreibungArray[position]);
        return row;
    }

}

这就是 .xml 的样子

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="90dp"
    android:background="@drawable/backgg"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/titleTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        android:paddingTop="5dp"
        android:text="Here is the Title"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="#fefefe" />

    <TextView
        android:id="@+id/beschTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingBottom="10dp"
        android:paddingLeft="20dp"
        android:paddingRight="20dp"
        android:text="Here is the Descrition"
        android:textColor="#fefefe" />

</LinearLayout>

首先,您需要像 Activity 那样实施 AdapterView.OnItemClickListener 而不是 View.OnClickListener

然后你还需要在你的列表视图上设置这个监听器,例如:

list.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // your code here
    }
});

您的代码可能还有其他问题,例如,如果您从列表视图中向它提供随机字符串,但没有详细说明具体是什么,Class.forName() 很可能会抛出异常你正在努力做到这一点很难说。

您的代码存在一些问题,我也为您提供了一些提示。

第一个问题,为什么ListClick事件不起作用。您实际上从未将它绑定到列表视图。
要在列表中启用点击事件,请使用此代码:

    list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            //Put your code here
        }
    });

此外,您已经在 activity 中实现了 onClick,因为您有 'implements OnClickListener'。为什么?你不使用它,所以把它删除。
我相当确定这也可以在您的列表单击事件处理程序如何处理单击事件方面发挥作用。由于 activity 的点击事件可能首先被触发,然后停止触发列表的点击事件。

一些提示:
1)用英文写你所有的代码,甚至是变量名和注释。人们更容易阅读 Makes(特别是因为您在英语论坛上寻求帮助)
2) 您可以使用 'LayoutInflater.from(Context)' 来获取 LayoutInflater,而不是使用 'getSystemService'.

的那一行长代码

可以通过扩展 ListActivity 而不是 Activity 来构造 ListView - onListItemClick 只有在扩展 ListActivity。你也可以取消实现 OnClickListener 不管你做什么。例如:

public class MainActivity extends ListActivity {

String[] titles = { "One", "two", "three", "four", "five"};
String[] beschreibung = { "1", "2", "3", "4", "5"};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

// VivzAdapter? Good to see another SlideNerd fan :)
    VivzAdapter adapter = new VivzAdapter(this, titles, beschreibung);
    setListAdapter(adapter);
}

protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    String cheese = titles[position];
    try {
        Class ourClass = Class.forName("com.example.benice." + cheese);
        Intent ourIntent = new Intent(this, ourClass);
        startActivity(ourIntent);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    }

只要您有其他 类 称为 "One"、"two"、"three" 等,这将有效。您还需要更改 getView() 自定义方法 ArrayAdapter.

public View getView(int position, View convertView, ViewGroup parent) {
    View row;

    if (convertView == null) {
        LayoutInflater inflator = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = inflator.inflate(R.layout.row, parent, false);
    } else {
        row = convertView;
    }

    TextView titles = (TextView) row.findViewById(R.id.titleTextView);
    TextView beschreibung = (TextView) row.findViewById(R.id.beschTextView);

    titles.setText(titlesArray[position]);
    beschreibung.setText(beschreibungArray[position]);

    return row;
}

This post 更深入 onListItemClick