Как обрабатывать событие click в Listview в android?
Ниже приведен код тестирования, чтобы создать представление списка, отобразить представление списка успешно, однако в событии клика есть ошибка. Я хотел бы создать намерение отправить сообщение жесткого кода в новое действие. Однако он показывает ошибку для строки
Intent intent = new Intent(context, SendMessage.class);
Итак, проблема в том, что я должен предоставить для этого класса?
Кроме того, вместо жесткого кода выводимое сообщение, как захватить данные в строке списка списка и перейти к новому действию? например BBB,AAA,R.drawable.tab1_hdpi
для первой строки.
Спасибо.
public class MainActivity extends Activity {
public final static String EXTRA_MESSAGE = "com.example.ListViewTest.MESSAGE";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList<ListEntry> members = new ArrayList<ListEntry>();
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(context, SendMessage.class);
String message = "abc";
intent.putExtra(EXTRA_MESSAGE, message);
startActivity(intent);
}
});
}
Ответы
Ответ 1
Я не вижу, где вы объявляете 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);
Ответ 2
В 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);
}
});
Ответ 3
Ошибка приходит в вашем коде из этого утверждения, как вы сказали
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);
}
});
Пожалуйста, дайте мне знать, если это поможет вам
EDIT: -
Если вы обнаружите некоторую проблему, чтобы получить значение списка, сделайте одну вещь, которая уменьшит список ваших массивов.
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, который вы используете для получения ранее установленного сообщения.
Ответ 4
Сначала класс должен реализовать прослушиватель кликов:
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();
}
Ответ 5
//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
Ответ 6
Согласно моему тесту,
-
реализует OnItemClickListener → работает.
-
setOnItemClickListener → работает.
-
По умолчанию ListView доступен по клику (API 19)
Важно то, что "click" работает только с TextView (если вы выберите simple_list_item_1.xml как элемент). Это означает, что если вы предоставляете текстовые данные для ListView, "click" работает, когда вы нажимаете на текстовую область. Щелчок на пустой области не вызывает событие click.