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.
- Evitar que ProgressDialog sea rechazado por onClick
- Android - Spinner + setOnClickListener
- Iniciación de inicio desde onclicklistener
- Android OnClickListener no disparar para el botón en Layout independiente
- Establecer OnClick Listener en el botón dentro de la vista de lista en android
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:
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); }
- OnClickListener para CardView?
- Cómo configurar OnClickListener para ScrollView?
- Cómo hacer algo después de que el usuario haga clic en mi EditText
- Diferente método para establecer OnClickListener de un botón en Android
- Java - Android - Split Activity / Class en varios archivos para una mejor organización (solución)
- Cómo implementar OnTouch Listener en XML
- Acceder a objetos personalizados en una vista de lista
- ¿Cómo puedo tener EditText con Clickable Spannables y todavía seleccionable por longClick?
¿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); }
- No se puede reemplazar el fragmento dentro de la pestaña por otro fragmento
- Cómo evitar la pérdida de datos de la aplicación Android durante la actualización (problema aleatorio)