Подтвердить что ты не робот

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 без принудительного закрытия?

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

4b9b3361

Ответ 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();
        }

Я надеюсь, что это сработает для вас:)