Establecer onClickListener a LinearLayout llenado por adaptador personalizado

Intento mostrar dos listas dentro de mi ScrollView. Encontré la siguiente solución: Usar un ListAdapter para rellenar un LinearLayout dentro de un diseño ScrollView (rellenar LinearLayout con un adaptador personalizado).

Esta solución funciona bien, pero no sé cómo manejar el evento de clic en los elementos de la lista. Sería sencillo si utilicé ListView (método onItemClick con el parámetro de posición), pero LinearLayout no admite la misma funcionalidad.

Mi diseño:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:layout_width="match_parent" android:orientation="vertical" android:scrollbars="none" android:background="@color/background_gray_light"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> // here should be view with infobox, not implemented yet // <LinearLayout android:id="@+id/story_list_inbox" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/archive" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="8dp" android:paddingBottom="8dp" android:background="@color/actionbar_bg" android:text="@string/archive" android:textSize="16dp" android:textColor="@color/text_gray" android:gravity="center_horizontal" /> <LinearLayout android:id="@+id/story_list_archive" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> 

Rellenar las listas:

 public class StoryListFragment extends Fragment { public StoryListFragment() {} @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_story_list, container, false); TextView archiveText = (TextView) view.findViewById(R.id.archive); archiveText.setText(archiveText.getText().toString().toUpperCase()); final List<Story> storyList = new ArrayList<Story>(); // filling the list .... StoryListAdapter adapter = new StoryListAdapter(getActivity(), R.layout.story_list_item, storyList); LinearLayout inbox = (LinearLayout) view.findViewById(R.id.story_list_inbox); final int inboxCount = adapter.getCount(); for (int i = 0; i < inboxCount; i++) { View item = adapter.getView(i, null, null); inbox.addView(item); } /* archive */ // filling the list .... LinearLayout archive = (LinearLayout) view.findViewById(R.id.story_list_archive); final int archiveCount = adapter.getCount(); for (int i = 0; i < archiveCount; i++) { View item = adapter.getView(i, null, null); archive.addView(item); } return view; } } 

Pregunta:

¿Cómo debo hacer clicable los elementos de la lista LinearLayout para poder obtener el índice del elemento que se ha hecho clic?

Lo que incluso quiero lograr:

Tal vez ni siquiera estoy usando la solución correcta, lo que estoy tratando de lograr aquí es crear algo como una bandeja de entrada de mensajes, que consta de dos listas: una para los mensajes más nuevos y la segunda para los mensajes archivados. También quiero mostrar algún contenido en la parte superior de las listas, por lo que ponerlo todo dentro de un ScrollView. Debe tener un aspecto como este:

introduzca la descripción de la imagen aquí

SOLUCIÓN:

 for (int i = 0; i < inboxCount; i++) { final int index = i; View item = adapter.getView(i, null, null); item.setOnClickListener(new OnClickListener() { public void onClick(View v) { System.out.println("Clicked " + index); startActivity(new Intent(v.getContext(), StoryIntroActivity.class)); } }); inbox.addView(item); } 

¿Cómo debo hacer clicable los elementos de la lista LinearLayout para poder obtener el índice del elemento que se ha hecho clic?

Puede hacer lo siguiente para pasar el índice del elemento pulsado a otra actividad en la que quizás desee responder al clic. En el interior de su onCreate haga algo como esto:

 getListView().setOnItemClickListener(new OnItemClickListener(){ public void onItemClick(AdapterView<?> arg0, View v, int position, long id) { //position is the item number in your listview Intent intent = new Intent(getApplicationContext(),xyz.class); intent.putExtra("itemNo.", position); startActivity(intent); } }); 

Tenga en cuenta que si su clase extiende ListActivity , sólo puede utilizar this.getListView() directamente como se ListActivity más arriba. Si amplía Activity , consulte esta respuesta .

La respuesta sugiere:

Siempre que utilice Activity, establecerá your_layout.xml como ContentView de su actividad. Así que el ListView debe b en your_layout.xml.

Que ListView debe tener un atributo id definido en el archivo xml decir: (android: id = "@ + id / list"). Obtendrá su objeto ListView algo así:

 setContentView(R.layout.your_layout); ListView list = (ListView)findViewById(R.id.list); list.addFooterView(view); 

La solución es establecer el onClickListener a la vista creada dinámicamente de la siguiente manera:

  for (int i = 0; i < inboxCount; i++) { final int index = i; View item = adapter.getView(i, null, null); item.setOnClickListener(new OnClickListener() { public void onClick(View v) { System.out.println("Clicked " + index); startActivity(new Intent(v.getContext(), StoryIntroActivity.class)); } }); inbox.addView(item); } 
  • SetOnItemClickListener no funciona
  • Cómo poner un oyente onclick dentro de un servicio
  • Excepción de puntero nulo en .setOnClickListener
  • Cómo utilizar el método onClickListener de Button en un ListView
  • Parámetro de vista de Android para el método OnClickListener
  • setOnClickListener en un TextView dentro de un Cardview
  • SetOnClickListener y setOnLongClickListener llamada en cuestión de botón único
  • Cajón de navegación OnItemClickListener
  • ¿Cómo dejar pasar el evento a container en android?
  • ¿Cuál es la diferencia entre RxJava 2 Cancellable y Desechable?
  • SetOnItemClickListener en ListView que afecta a varias filas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.