¿Cómo afectar a elementos fuera de un listview cuando se hace clic en algunos elementos de la vista de lista?

Tengo un ListView en mi distribución content_main.xml. El contenido de esta lista se establece mediante listview.setAdapter (myCustomAdapter). También tengo un TextView en el diseño content_main.xml.

He creado mi propio adaptador personalizado llamado ArrayAdapterItem que extiende ArrayAdapter. En el método getView () de este adaptador, estoy intentando obtener acceso al TextView contenido en content_main.xml. No sé cómo hacer eso. Tengo que poder hacer esto porque quiero actualizar este TextView con nueva información si se hace clic en algún elemento de la lista. Sin embargo no puedo tener acceso a esto a través de parent.findViewbyId (R.id.main_activity_textView). Este método devuelve null en tiempo de ejecución.

He intentado google esta, pero sólo obtener respuestas sobre diferentes temas que no está relacionado con la mía.

Soy nuevo en android. La solución a esto podría ser simple, pero no puedo encontrar ningún tutorial o preguntas sobre stackoverflow que se ocupan de esto.

MainActivity.java

package com.example.simran.listviewtest; import android.app.AlertDialog; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.view.Menu; import android.view.MenuItem; import android.widget.ListView; public class MainActivity extends AppCompatActivity { AlertDialog alertDialogStores; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); showList(); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); } public void showList(){ // add your items, this can be done programatically // your items can be from a database ObjectItem[] ObjectItemData = new ObjectItem[20]; ObjectItemData[0] = new ObjectItem(91, "Mercury"); ObjectItemData[1] = new ObjectItem(92, "Watson"); ObjectItemData[2] = new ObjectItem(93, "Nissan"); ObjectItemData[3] = new ObjectItem(94, "Puregold"); ObjectItemData[4] = new ObjectItem(95, "SM"); ObjectItemData[5] = new ObjectItem(96, "7 Eleven"); ObjectItemData[6] = new ObjectItem(97, "Ministop"); ObjectItemData[7] = new ObjectItem(98, "Fat Chicken"); ObjectItemData[8] = new ObjectItem(99, "Master Siomai"); ObjectItemData[9] = new ObjectItem(100, "Mang Inasal"); ObjectItemData[10] = new ObjectItem(101, "Mercury 2"); ObjectItemData[11] = new ObjectItem(102, "Watson 2"); ObjectItemData[12] = new ObjectItem(103, "Nissan 2"); ObjectItemData[13] = new ObjectItem(104, "Puregold 2"); ObjectItemData[14] = new ObjectItem(105, "SM 2"); ObjectItemData[15] = new ObjectItem(106, "7 Eleven 2"); ObjectItemData[16] = new ObjectItem(107, "Ministop 2"); ObjectItemData[17] = new ObjectItem(108, "Fat Chicken 2"); ObjectItemData[18] = new ObjectItem(109, "Master Siomai 2"); ObjectItemData[19] = new ObjectItem(110, "Mang Inasal 2"); // our adapter instance ArrayAdapterItem adapter = new ArrayAdapterItem(this, R.layout.list_view_row_item, ObjectItemData); // create a new ListView, set the adapter and item click listener ListView listViewItems = (ListView)findViewById(R.id.main_activity_listView); listViewItems.setAdapter(adapter); listViewItems.setOnItemClickListener(new OnItemClickListenerListViewItem()); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } 

ArrayAdapterItem.java

  package com.example.simran.listviewtest; import android.app.Activity; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; import org.w3c.dom.Text; /** * Created by simra on 12/23/2015. */ public class ArrayAdapterItem extends ArrayAdapter<ObjectItem> { Context mContext; int layoutResourceId; ObjectItem data[] = null; public ArrayAdapterItem(Context mContext, int layoutResourceId, ObjectItem[] data) { super(mContext, layoutResourceId, data); this.layoutResourceId = layoutResourceId; this.mContext = mContext; this.data = data; } @Override public View getView(int position, View convertView, ViewGroup parent) { /* * The convertView argument is essentially a "ScrapView" as described is Lucas post * http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/ * It will have a non-null value when ListView is asking you recycle the row layout. * So, when convertView is not null, you should simply update its contents instead of inflating a new row layout. */ if (convertView == null) { // inflate the layout LayoutInflater inflater = ((Activity) mContext).getLayoutInflater(); convertView = inflater.inflate(layoutResourceId, parent, false); } //trying set the text of the textView in the main_activity. TextView mainActivityTextView = (TextView) parent.findViewById(R.id.main_activity_textView); mainActivityTextView.setText("some new text"); // object item based on the position ObjectItem objectItem = data[position]; // this sets the text and tag for the item in the list. Works fine TextView textViewItem = (TextView) convertView.findViewById(R.id.textViewItem); textViewItem.setText(objectItem.itemName); textViewItem.setTag(objectItem.itemId); return convertView; } } 

Content_main.xml

  `<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="com.example.simran.listviewtest.MainActivity" tools:showIn="@layout/activity_main"> <TextView android:id="@+id/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" android:layout_alignParentTop="true"/> <ListView android:id="@+id/options_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/hello_world"> </ListView> </RelativeLayout>` 

List_view_row_item.xml

  <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10dp" > <TextView android:id="@+id/textViewItem" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:text="Item name here..." android:textSize="15dp" /> </RelativeLayout> 

ObjectItem.java

  package com.example.simran.listviewtest; /** * Created by simra on 12/23/2015. */ public class ObjectItem { public int itemId; public String itemName; // constructor public ObjectItem(int itemId, String itemName) { this.itemId = itemId; this.itemName = itemName; } } 

Tiene tres opciones (sólo tres ejemplos):

  • Utilice el escucha de clics proporcionado con ListView. (metodo preferido)
  • Inyectar la dependencia a través del constructor de adaptadores.
  • Utilice el patrón de escucha para notificar la actividad.

Nota: No estoy seguro de por qué tendría que actualizar un TextView cuando el método getView se llama, getView se puede llamar salir con frecuencia (al desplazarse por ejemplo), esto significa que TextView se actualizará casi al azar. Yo iría por la opción 1, que es la forma más confiable y preferida de reaccionar a los clics en los elementos de su lista.

Opción 1:

 public class ExampleActivity extends Activity implements OnItemClickListener { private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Set layout etc textView = (TextView) findViewById(some id); //Find the TextView ListView list = (ListView) findViewById(some id); //Find the ListView //Set adapter etc. list.setOnItemClickListener(this); } @Override public void onItemClick(AdapterView<?> adapterView, View view, int pos, long id) { textView.setText("Some text"); //Get the text from your adapter for example } } 

Opcion 2:

 public ArrayAdapterItem(Context mContext, int layoutResourceId, ObjectItem[] data, TextView textview) { //etc. } 

Opción 3:

Adaptador:

  package com.example.simran.listviewtest; import android.app.Activity; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; import org.w3c.dom.Text; /** * Created by simra on 12/23/2015. */ public class ArrayAdapterItem extends ArrayAdapter<ObjectItem> { Context mContext; int layoutResourceId; ObjectItem data[] = null; ArrayAdapterItemCallback callback; public interface ArrayAdapterItemCallback { updateText(String text); } public ArrayAdapterItem(Context mContext, int layoutResourceId, ObjectItem[] data, ArrayAdapterItemCallback callback) { super(mContext, layoutResourceId, data); this.layoutResourceId = layoutResourceId; this.mContext = mContext; this.data = data; this.callback = callback; } @Override public View getView(int position, View convertView, ViewGroup parent) { /* * The convertView argument is essentially a "ScrapView" as described is Lucas post * http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/ * It will have a non-null value when ListView is asking you recycle the row layout. * So, when convertView is not null, you should simply update its contents instead of inflating a new row layout. */ if (convertView == null) { // inflate the layout LayoutInflater inflater = ((Activity) mContext).getLayoutInflater(); convertView = inflater.inflate(layoutResourceId, parent, false); } //trying set the text of the textView in the main_activity. callback.updateText("some new text"); // object item based on the position ObjectItem objectItem = data[position]; // this sets the text and tag for the item in the list. Works fine TextView textViewItem = (TextView) convertView.findViewById(R.id.textViewItem); textViewItem.setText(objectItem.itemName); textViewItem.setTag(objectItem.itemId); return convertView; } } 

Actividad:

 public class ExampleActivity extends Activity implements UpdateActivity { //etc. TextView text; //Init this in the onCreate @Override void updateText(String text){ text.setText(text); } } 

Usted puede utilizar el LocalBroadCastManager, bye esto usted puede comunicarse dentro de su aplicación de cualquier lugar a cualquier lugar

Usted puede comprobar hacia fuera, cómo utilizar el LocalBraodcastManager usando esto.

Cómo usar LocalBroadcastManager?

Lo que necesita no es muy difícil tratar de pensar de nuevo lo que exactamente quieres,

Qué usted tiene es TextView para poblar la información que está en una variable de la instancia de la clase ObjectItem tipo,

Usted puede conseguir fácilmente el objeto de la lista que se hace clic en esto

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { ObjectItem singleItem = (ObjectItem) listView.getItemAtPosition(position); textView.setText(""+singleItem.itemName); //this is the textView which you should already get the reference in Main Activity } }); 

Cuando usted evalúa lo que necesita es fácil de reducir el código, no hay necesidad de implementar algún código que no puede utilizar para cualquier otro trabajo. Lo siento por el comentario, pero que es otra manera de dar vuelta a su coche alrededor 🙂

Cuando se trabaja con adaptadores listview en Android, casi siempre se deben colocar como una clase interna de la clase que los utiliza – en este caso es su clase MainActivity. Cuando el adaptador es una clase interna, puede utilizar todos los atributos de la clase de inclusión. Si el textView que quieres actualizar ya no existe, ahí es donde debe estar.

Usted debe reemplazar:

 parent.findViewById(...) by convertView.findViewById(...) 
  • Android Studio AndroidManifest.xml vs build.gradle
  • Se muestra Google Maps Android sólo pantalla en blanco
  • Concatenar cadenas múltiples en XML?
  • Escapar de soportes de ángulo en XML en Eclipse / Android
  • Estilo PopupMenu Android
  • Recepción de SMS en Android Manifest.xml
  • ¿Cajón de la navegación sobre la barra de estado en turrón?
  • ¿El tema de AppCompat DayNight no funciona en Android 6.0?
  • Cómo convertir XML a Android XML binario
  • La vista de vídeo no es de pantalla completa en modo horizontal
  • Android - Personalizar el cuadro de diálogo con un diseño Xml
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.