onListItemClick不能与我的ListView一起使用

时间:2015-02-24 21:38:44

标签: android eclipse onclick

我尝试使用我的字符串数组中的Clickable字符串创建一个列表。 通过单击我想要访问以此字符串命名的类的任何字符串。 我尝试使用onListItemClick ...但它不起作用:S ..对解决方案的任何建议?

感谢您的时间:)

我有一些字符串例如名为“标题1”,“标题2”以及在ListView中名为“描述1”,“描述2”......的每个标题下的一些描述。通过点击“标题”,我想要一个名为Title的类。如何用我的构造做到这一点?

列表视图

标题1 说明1

标题2 说明2

标题3 说明3

ListviewEnd

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>

3 个答案:

答案 0 :(得分:0)

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

然后你还需要在listview上设置这个监听器,例如:

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

您的代码可能还有其他问题,例如,如果您从列表视图中提供随机字符串,则Class.forName()很可能会抛出异常,但没有更详细的信息你努力做到这一点很难说。

答案 1 :(得分:0)

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

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

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

此外,您已在活动中实施了onClick,因为您已经实现了OnClickListener&#39;。为什么?你不使用它,所以只需删除它 我相当肯定这也可以在列表点击事件处理程序处理点击事件方面发挥作用。由于活动的click事件可能首先被触发,然后停止触发列表的click事件。

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

的那一长串代码。

答案 2 :(得分:0)

通过扩展ListView而不是ListActivity - Activity来构建您的onListItemClick是可行的,只有在您扩展{{1}时才能使用代码中的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”等的类,这将有效。您还需要在自定义{{1}中更改getView()方法的构造}。

ArrayAdapter

This post更加深入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; }