Intereting Posts
IllegalArgumentException, вызванное requestLocationUpdate () Не удалось получить TelephonyManager.CALL_STATE_RINGING Google Play говорит, что мой APK, созданный с помощью Android Studio Build-> Generate Signed APK, отлаживается Как обращаться к частным строкам ОС Android программно? Использование Simple XML и получение NoClassDefFoundError в Android Как отправить SOAP-запрос и Parse SOAP-ответ в формате XML в Android? Ошибка доступа Realm от неправильной нити при использовании общего кода между IntentService и AsyncTask (Android) Новая созданная папка «values» не отображается в Android Studio Android Layout – заполнить остальную часть пространства, кроме Новый для android нужно понимать "? Android: attr / actionBarSize" Индикатор круглого пейджера не выглядит круглым Анимация анимации Google Plus Виртуальное устройство статистики genymotion, но отображающее белый экран …? API Карт Google v2: как сделать маркеры доступными для кликов? Консоль разработчика Google Play отклонила мое обновление приложения

Как обрабатывать событие 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); } }); } 

Solutions Collecting From Web of "Как обрабатывать событие click в Listview в android?"

Я не вижу, где вы объявляете 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); 

В ListView есть обратный вызов прослушивателя элемента. Вы должны установить onItemClickListener в ListView . Обратный AdapterView содержит параметр 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); } }); 

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

 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, который вы используете для получения ранее установленного сообщения.

Во-первых, класс должен реализовывать прослушиватель кликов:

 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(); } 
  //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 

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

  1. Реализует OnItemClickListener -> работает.

  2. SetOnItemClickListener -> работает.

  3. По умолчанию ListView доступен по клику (API 19)

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

 listView.setOnItemClickListener(this); @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { String typeMap=((TextView) view).getText().toString(); }