Выберите элемент из списка ListView [duplicate]

Все это хорошие ответы. Я хотел бы добавить пример выполнения при передаче объектов по значению vs по ссылке:

#include <iostream>

using namespace std;

// Base class
class A {
public:
    A() {}
    A(const A& a) {
        cout << "'A' copy constructor" << endl;
    }
    virtual void run() const { cout << "I am an 'A'" << endl; }
};

// Derived class
class B: public A {
public:
    B():A() {}
    B(const B& a):A(a) {
        cout << "'B' copy constructor" << endl;
    }
    virtual void run() const { cout << "I am a 'B'" << endl; }
};

void g(const A & a) {
    a.run();
}

void h(const A a) {
    a.run();
}

int main() {
    cout << "Call by reference" << endl;
    g(B());
    cout << endl << "Call by copy" << endl;
    h(B());
}

Выход:

Call by reference
I am a 'B'

Call by copy
'A' copy constructor
I am an 'A'
37
задан Bishan 25 July 2013 в 08:40
поделиться

6 ответов

Я не вижу, где вы объявляете context. С целью создания намерения вы можете использовать MainActivity.this

 lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                    long id) {
                Intent intent = new Intent(MainActivity.this, SendMessage.class);
                String message = "abc";
                intent.putExtra(EXTRA_MESSAGE, message);
                startActivity(intent);
            }
        });

. Чтобы получить объект после нажатия, вы можете использовать AdapterView:

ListEntry entry = (ListEntry) parent.getItemAtPosition(position);
85
ответ дан Blackbelt 20 August 2018 в 15:01
поделиться
  • 1
    Спасибо, что означает контекст? – user782104 25 July 2013 в 08:33
  • 2
    вы могли бы перефразировать? – Blackbelt 25 July 2013 в 08:37
  • 3
    Это означает, что на самом деле представляет собой первый параметр в классе Intent? Что означает MainActivity.this? благодаря – user782104 25 July 2013 в 08:38
  • 4
    из документации This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents. У него есть информация, необходимая для запуска вашей деятельности SendMessage. – Blackbelt 25 July 2013 в 08:39
  • 5
    Спасибо также, почему не удалось найти явный класс активности {com.example.listviewtest / com.example.listviewtest.ItemDetails}; Вы объявили эту активность в своем AndroidManifest.xml? – user782104 25 July 2013 в 08:44

Ошибка в вашем коде из этого утверждения, как вы сказали

Intent intent = new Intent(context, SendMessage.class);

Это связано с тем, что вы предоставляете контекст анонимного класса OnItemClickListener в конструкторе Intent, но в соответствии с конструктором Intent

android.content.Intent.Intent(Context packageContext, Class<?> cls)

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

Intent intent = new Intent(MainActivity.this, SendMessage.class);

. Также для отправки вашего сообщения из этого MainActivity в класс SendMessage см. ниже код

lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                    long id) {
                ListEntry entry= (ListEntry) parent.getAdapter().getItem(position);
                Intent intent = new Intent(MainActivity.this, SendMessage.class);
                intent.putExtra(EXTRA_MESSAGE, entry.getMessage());
                startActivity(intent);
            }
        });

Пожалуйста, дайте мне знать если это поможет вам

ИЗМЕНИТЬ: - Если вы обнаружите какую-то проблему, чтобы получить значение списка, сделайте одну вещь, которая уменьшит ваш список массивов

ArrayList<ListEntry> members = new ArrayList<ListEntry>();

во всем мире, т.е. до того, как он будет создан и изменит ваш слушателя, как показано ниже

 lv.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position,
                        long id) {
                    Intent intent = new Intent(MainActivity.this, SendMessage.class);
                    intent.putExtra(EXTRA_MESSAGE, members.get(position));
                    startActivity(intent);
                }
            });

Таким образом, весь ваш код будет выглядеть как

public class MainActivity extends Activity {
    public final static String EXTRA_MESSAGE = "com.example.ListViewTest.MESSAGE";
ArrayList<ListEntry> members = new ArrayList<ListEntry>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        members.add(new ListEntry("BBB","AAA",R.drawable.tab1_hdpi));
        members.add(new ListEntry("ccc","ddd",R.drawable.tab2_hdpi));
        members.add(new ListEntry("assa","cxv",R.drawable.tab3_hdpi));
        members.add(new ListEntry("BcxsadvBB","AcxdxvAA"));
        members.add(new ListEntry("BcxvadsBB","AcxzvAA"));
        members.add(new ListEntry("BcxvBB","AcxvAA"));
        members.add(new ListEntry("BvBB","AcxsvAA"));
        members.add(new ListEntry("BcxvBB","AcxsvzAA"));
        members.add(new ListEntry("Bcxadv","AcsxvAA"));
        members.add(new ListEntry("BcxcxB","AcxsvAA"));
        ListView lv = (ListView)findViewById(R.id.listView1);
        Log.i("testTag","before start adapter");
        StringArrayAdapter ad = new StringArrayAdapter (members,this);
        Log.i("testTag","after start adapter");
        Log.i("testTag","set adapter");
        lv.setAdapter(ad);
        lv.setOnItemClickListener(new OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position,
                            long id) {
                        Intent intent = new Intent(MainActivity.this, SendMessage.class);
                        intent.putExtra(EXTRA_MESSAGE, members.get(position).getMessage());
                        startActivity(intent);
                    }
                });
    }

. Где getMessage () будет методом getter, указанным в вашем классе ListEntry, который вы используете для получения сообщение, которое было установлено ранее.

6
ответ дан Abhinav Singh Maurya 20 August 2018 в 15:01
поделиться
  • 1
    Метод getMessage () не определен для типа ListEntry? – user782104 25 July 2013 в 09:02
  • 2
    он имеет ошибку при въезде.getMessage (), извините забыл упомянуть – user782104 25 July 2013 в 09:02
  • 3
    @ user782104 проверьте мой отредактированный код – Abhinav Singh Maurya 25 July 2013 в 09:18

Сначала класс должен реализовать прослушиватель кликов:

implements OnItemClickListener

Затем установите прослушиватель в ListView

yourList.setOnItemclickListener(this);

И, наконец, создайте метод clic:

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Toast.makeText(MainActivity.this, "You Clicked at ",   
 Toast.LENGTH_SHORT).show();
}
6
ответ дан Avinash Garg 20 August 2018 в 15:01
поделиться

Согласно моему тесту,

  1. реализует OnItemClickListener -> работает.
  2. setOnItemClickListener -> works.
  3. ListView по умолчанию доступен по клику (API 19)

Важно то, что «щелчок» работает только TextView (если вы выберите simple_list_item_1.xml как элемент). Это означает, что если вы предоставляете текстовые данные для ListView, «щелчок» работает, когда вы нажимаете на текстовую область. Щелчок на пустой области не вызывает событие щелчка.

2
ответ дан Chaohsiung Huang 20 August 2018 в 15:01
поделиться

ListView имеет обратный вызов для прослушивателя элемента. Вы должны установить onItemClickListener в ListView. Обратный вызов содержит параметры AdapterView и position в качестве параметра. Что может дать вам ListEntry.

lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                    long id) {
                ListEntry entry= (ListEntry) parent.getAdapter().getItem(position);
                Intent intent = new Intent(MainActivity.this, SendMessage.class);
                String message = entry.getMessage();
                intent.putExtra(EXTRA_MESSAGE, message);
                startActivity(intent);
            }
        });
13
ответ дан Kapil Vats 20 August 2018 в 15:01
поделиться
  • 1
    Благодарю. Если объект записи имеет 3 элемента? две строки и одно целое (фото сохранено), как выставить его и перейти к новой активности (нужно ли это)? – user782104 25 July 2013 в 08:49
  • 2
    Вы можете выполнить Parcelable или Serializable в ListEntry и передать весь объект в вашу новую активность. – Kapil Vats 24 October 2015 в 18:59
    //get main activity
    final Activity main_activity=getActivity();

    //list view click listener
    final ListView listView = (ListView) inflatedView.findViewById(R.id.listView_id);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String stringText;

            //in normal case
            stringText= ((TextView)view).getText().toString();                

            //in case if listview has separate item layout
            TextView textview=(TextView)view.findViewById(R.id.textview_id_of_listview_Item);
            stringText=textview.getText().toString();                

            //show selected
            Toast.makeText(main_activity, stringText, Toast.LENGTH_LONG).show();
        }
    });

    //populate listview
2
ответ дан Rijul Sudhir 20 August 2018 в 15:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: