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 не шатается, но мой эмулятор дает мне силу.
Как мне получить
- Либо
onListItemClick()
щелкните в активности (предпочтительнее)
- Или я могу преобразовать код в
ListActivity
без принудительного закрытия?
Большое спасибо заранее.
Ответы
Ответ 1
Я пишу свой ответ как:
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, public method onItemClick() - это метод, вызываемый, когда элемент нажимается { вместо неизвестного защищенного метода onListItemClick()}
Ответ 2
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
}
});
Ответ 3
Для ListActivity
, чтобы иметь элемент-клик-прослушиватель для ListView
, вы должны вызвать setOnItemClickedListener()
в ListView
(возможно, вам понадобится использовать findViewById()
, если он исходит из XML)
Вместо того, чтобы просто переопределять ListActivity
onListItemClickListener()
, здесь вы можете использовать Activity
AdapterView.onItemClickedListener()
и передавать его как параметр setOnItemClickedListener()
.
(Если вы читаете исходный код для ListActivity
(который я рекомендую), вы увидите, что он просто делает это за кулисами, создавая внутренний объект-слушатель, который вызывает ваш переопределенный onListItemClick()
).
Ответ 4
Я работаю над этим весь день, и после создания своего собственного 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
с пользовательским шрифтом и фоном. Я уверен, что вам не все равно. Но я вышел и надеялся, разместив это, чтобы я мог помочь кому-то в будущем.
Ответ 5
Если вы используете 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
. Посмотрите другие ответы. Так мне нравится делать это, так как это более ясное и удобное для чтения.
Ответ 6
Я просто добавил следующее в 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);
}
Ответ 7
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);
}
}
Ответ 8
Предположим, что у вас есть источник данных. Фрукты содержат несколько строк. Вы можете определить 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();
}
Я надеюсь, что это сработает для вас:)