Все это хорошие ответы. Я хотел бы добавить пример выполнения при передаче объектов по значению 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'
Я не вижу, где вы объявляете 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);
Ошибка в вашем коде из этого утверждения, как вы сказали
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, который вы используете для получения сообщение, которое было установлено ранее.
Сначала класс должен реализовать прослушиватель кликов:
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();
}
Согласно моему тесту,
Важно то, что «щелчок» работает только TextView (если вы выберите simple_list_item_1.xml как элемент). Это означает, что если вы предоставляете текстовые данные для ListView, «щелчок» работает, когда вы нажимаете на текстовую область. Щелчок на пустой области не вызывает событие щелчка.
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);
}
});
//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
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