2015-02-24 2 views
0

Я пытаюсь сделать список с помощью Clickable строк из моего массива строк. Нажимая на любую строку, я хочу получить классы, названные в честь этой строки. Я пробовал с onListItemClick ... но он не работает: S .. любые предложения для решения?onListItemClick не работает с моим списком ListView

Спасибо за ваше время :)

У меня есть несколько строк, например под названием «Title 1», «Заголовок 2» и небольшое описание под каждым заголовком называется «Описание 1», «Описание 2» ... в ListView. Нажимая на «title», я хочу попасть в класс с названием Title. Как это сделать с моей конструкцией?

ListView

Название 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> 

ответ

0

Можно построить ваш ListView путем расширения ListActivity, а не Activity - 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(); 
    } 
    } 

Это будет работать до тех пор, как вы другие классы называют «Один», «два», «три» и т.д. Кроме того, необходимо изменить конструкцию вашего метода 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.

+0

Благодарим вас за ответ. Да, я только начинаю сжигать и vivz делать хорошие видео :)) – user3884522

0

Прежде всего вам нужно реализовать 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(), скорее всего, будет бросать исключение, если вы кормите его случайными строками из списка, но не более подробно о том, что именно вы пытаетесь сделать, это трудно сказать.

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. Зачем? Вы не используете его, поэтому просто удалите его.
Я уверен, что это также может сыграть роль в том, как события кликов обрабатываются обработчиком событий списка. Поскольку событие click для активности может сначала запускаться, а затем остановить событие щелчка из списка при запуске.

Несколько советов:
1) Напишите весь свой код на английском языке, даже имена переменных и комментарии. Делается намного легче для людей читать (особенно, так как вы просите о помощи на англоязычном форуме)
2) Вы можете использовать «LayoutInflater.from (Context)», чтобы получить LayoutInflater вместо этой длинной строки кода где вы используете 'getSystemService'.

Смежные вопросы