Android: onListItemClick в действии

В прошлый раз, когда я задал вопрос, я многому научился, поэтому думаю, стоит попробовать еще раз.

Я использую ленивый список от Fedor по этой ссылке: ленивая загрузка изображений в ListView

Он работает как шарм. НО, Федор делает свой основной класс расширением Activity вместо ListActivity . Из-за этого я больше не могу использовать listItemClick-прослушиватель. Eclipse объявляет некоторые ошибки в onListItemClick() . Он работает, когда я поворачиваю

  @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); // Intent launcher here } 

в

  protected void onListItemClick(ListView l, View v, int position, long id) { // Intent launcher here } 

Но программа запуска не работает. Также не сообщает тост.

Когда я включаю Activity в ListActivity , Eclipse не ListActivity , но мой эмулятор дает мне силу.

Как я могу получить

  • Либо onListItemClick() щелкните в активности (желательно)
  • Или я могу преобразовать код в ListActivity без принудительного закрытия?

Заранее большое спасибо.

Solutions Collecting From Web of "Android: onListItemClick в действии"

Я пишу свой ответ как:

1) код @Falmarri нуждается в некотором обновлении
2) Мое предложенное редактирование было полностью отклонено XD
3) Stackoverflow не позволяет мне написать комментарий.

Вот код:

 ListView listView = (ListView) findViewById(R.id.my_listview_in_layout); listview.setOnItemClickListener(new AdapterView.OnItemClickListener(){ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id){ //Do stuff //... } }); 

Ссылка: Согласно android.widget.AdapterView.OnItemClickListener , открытый метод onItemClick () – это метод, вызываемый при щелчке элемента { вместо неизвестного защищенного метода onListItemClick () }

ListItemClickListener подключен к ListView . Когда вы изменили ListActivity на Activity , у вашего класса больше нет связанного с ним вида, и поэтому класс Activity не имеет понятия, что делать с onListItemClickListener.

Вам просто нужно подключить слушателя к ListView :

 listview.setOnItemClickListener(new OnItemClickListener(){ @Override protected void onListItemClick(AdapterView<?> parent, View view, int position, long id){ //Do stuff } }); 

Я работаю над этим весь день, и после создания своего собственного ArrayAdapter я не мог понять, как менять классы в моем списке.

Вот как я узнал, как это сделать. После того, как я вызвал свой массив, я просто закончил свой код в этом методе.

 ListView lv =getListView(); lv.setOnItemClickListener(this); 

Тогда, после всего моего текста, который я ставил

 public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { String item = (String) getListAdapter().getItem(position); if (item.equals("Economy")) { Intent intent = new Intent(packages.this, economy.class); startActivity(intent); } else if (item.equals("Basic")) { Intent intent = new Intent(packages.this, basic.class); startActivity(intent); } else if (item.equals("Professional")) { Intent intent = new Intent(packages.this, professional.class); startActivity(intent); } else if (item.equals("Custom Applications")) { Intent intent = new Intent(packages.this, applications.class); startActivity(intent); } } 

Между мной удалось полностью настроить мой ListView с пользовательским шрифтом и фоном. Я уверен, что вам не все равно. Но я вышел и надеялся, разместив это, чтобы я мог помочь кому-то в будущем.

Для не ListActivity чтобы иметь ListViewsetOnItemClickedListener() для ListView , вы должны вызвать setOnItemClickedListener() в ListView (вам может понадобиться получить это с помощью findViewById() если он исходит из XML)

Вместо того, чтобы просто переопределять ListActivity onListItemClickListener() , здесь вы должны AdapterView.onItemClickedListener() Activity AdapterView.onItemClickedListener() и передать его как параметр setOnItemClickedListener() .

(Если вы читаете исходный код ListActivity (который я рекомендую), вы увидите, что он просто делает это за кулисами, создавая внутренний объект-слушатель, который вызывает ваш переопределенный onListItemClick() ).

Если вы используете ListActivity вы хотите сделать что-то вроде этого:

 public class YourClass extends ListActivity implements OnItemClickListener{ @Override public void onCreate(Bundle icicle){ super.onCreate(icicle); setContentView(R.layout.your_layout); getListView().setOnItemClickListener(this); } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // your stuff here } } 

Это не единственный способ установить OnItemClickListener . Посмотрите другие ответы. Это то, как я люблю это делать, так как это более понятно и легче читать.

FE.java

 package com.example.rfe; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import android.app.ListActivity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; public class FE extends ListActivity { public List<String> d = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.file); d = new ArrayList<String>(); Scanner in = null; File f = new File("/sdcard/input.txt"); try { in = new Scanner(new FileReader(f)); while(in.hasNext()==true) { d.add(in.nextLine()); } }catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } ArrayAdapter<String> fileList = new ArrayAdapter<String>(this, R.layout.row, d); setListAdapter(fileList); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { String selection = l.getItemAtPosition(position).toString(); Toast.makeText(this, selection, Toast.LENGTH_LONG).show(); super.onListItemClick(l, v, position, id); } } в package com.example.rfe; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import android.app.ListActivity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; public class FE extends ListActivity { public List<String> d = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.file); d = new ArrayList<String>(); Scanner in = null; File f = new File("/sdcard/input.txt"); try { in = new Scanner(new FileReader(f)); while(in.hasNext()==true) { d.add(in.nextLine()); } }catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } ArrayAdapter<String> fileList = new ArrayAdapter<String>(this, R.layout.row, d); setListAdapter(fileList); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { String selection = l.getItemAtPosition(position).toString(); Toast.makeText(this, selection, Toast.LENGTH_LONG).show(); super.onListItemClick(l, v, position, id); } } 

Предположим, что у вас есть источник данных. Фрукты содержат несколько строк. Вы можете определить onCreate() следующим образом:

 setListAdapter(new ArrayAdapter<String>(this, R.layout.list_fruit, FRUITS)); // context is this, style is list_fruit, Context, ,data_binding to FRUITs 

А затем напишите onListItemClick() следующим образом:

 protected void onListItemClick(ListView parent, View v, int position, long id) { Toast.makeText(this, " You selected " + FRUITS[position], Toast.LENGTH_SHORT).show(); } 

Надеюсь, это сработает для вас 🙂

Я просто добавил следующее в onCreate() :

  listvview.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { setPaymentDetails(); } }); 

Вне onCreate() добавлен setPaymentDetails() :

 protected void setPaymentDetails() { Intent intent = new Intent(this, SetPaymentDetailsActivity.class); startActivity(intent); }