Android: Listview se duplica cuando inicie una nueva actividad y presiona atrás para volver a ella
Tengo dos vistas de la lista que son fragmentos en las lengüetas del paginador de la visión. Al hacer clic en los elementos de la vista de lista, se inicia una nueva actividad. Pero cuando presiono el botón de retroceso para volver a la vista de lista con pestañas, la vista de lista se ha duplicado y si abro la actividad y vuelvo a repetirla se duplica otra vez y seguirá haciéndolo. También tengo otra vista tabulada de la lista con cinco lengüetas y cuando voy dos lengüetas lejos de una de las vistas. Los elementos en esa vista doble cuando vuelvo a ellos y esto es lo mismo para todas las otras pestañas. El código de las dos vistas de lista es idéntico. He intentado list.clear (), que sólo borra todos los elementos de la lista y han jugado con la declaración "else" en el titular de la vista (recomendado por otras respuestas de desbordamiento de la pila). Pero cada vez que la vista de lista todavía duplica. También a menos que usted no ha notado ya soy bastante nuevo para Android.
Aquí está el código para el fragmento de vista de lista (Due_Today_Fragment) que está en una actividad de dos pestañas.
- ¿Debe un novato olvidarse de los fragmentos?
- IllegalStateException: Fragmento ya agregado en el fragmento tabhost
- ¿Cómo inhabilito las pestañas deslizantes cuando estoy en la barra de acción contextual, haciendo que las pestañas no se puedan hacer clic / deslizar?
- Cambiar el relleno de TextView en TabLayout
- Android ICS + ActionBar Tabs + Cambio de orientación
import java.util.ArrayList; import java.util.List; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; public class Due_Today_Fragment extends Fragment { private List<homeworkdue> myhomeworkdue; static class ViewHolder { public ImageView imageView; public TextView HomeworkDueText; public TextView DescriptionText; public TextView TeacherText; } public static final String KEY_HOMEWORK="homework"; public static final String KEY_DESC="desc"; public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ return inflater.inflate(R.layout.activity_main, container, false); } @Override public void onResume() { // TODO Auto-generated method stub super.onResume(); myhomeworkdue = new ArrayList<homeworkdue>(); populatehomeworkdueList(); populateListView(); registerClickCallback(); } private void registerClickCallback() { ListView list = (ListView)getView().findViewById(R.id.listView1); list.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id) { homeworkdue clickedhomeworkdue = myhomeworkdue.get(position); Intent intent = new Intent(getActivity(), homeworkdueDetailsActivity.class); intent.putExtra(KEY_HOMEWORK, clickedhomeworkdue.getHomeworkdue()); intent.putExtra(KEY_DESC, clickedhomeworkdue.getDesciption()); startActivity(intent); } }); } private void populatehomeworkdueList() { myhomeworkdue.add(new homeworkdue("History Homework", "Description 1", R.drawable.global_studies, "Anderson")); myhomeworkdue.add(new homeworkdue("Math Homework", "Description 2", R.drawable.mathematics, "Klein")); myhomeworkdue.add(new homeworkdue("English Homework", "Description 3", R.drawable.english, "Reed")); myhomeworkdue.add(new homeworkdue("Spanish Homework", "Description 4", R.drawable.spanish, "Joya")); myhomeworkdue.add(new homeworkdue("Science Homework", "Description 5", R.drawable.science, "Poole")); } private void populateListView() { ArrayAdapter<homeworkdue> adapter = new MyListAdapter(); ListView list = (ListView)getView().findViewById(R.id.listView1); list.setAdapter(adapter); } public class MyListAdapter extends ArrayAdapter<homeworkdue> { public MyListAdapter() { super(getActivity(), R.layout.item_view, myhomeworkdue); } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView==null){ convertView = getActivity().getLayoutInflater().inflate(R.layout.item_view, parent, false); holder = new ViewHolder(); holder.imageView = (ImageView)convertView.findViewById(R.id.item_iconclass); holder.HomeworkDueText = (TextView) convertView.findViewById(R.id.item_texthomeworkdue); holder.DescriptionText = (TextView) convertView.findViewById(R.id.item_textdescription); holder.TeacherText = (TextView) convertView.findViewById(R.id.item_textteacher); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } homeworkdue currenthomeworkdue = myhomeworkdue.get(position); holder.imageView.setImageResource(currenthomeworkdue.getIconID()); holder.HomeworkDueText.setText(currenthomeworkdue.getHomeworkdue()); holder.DescriptionText.setText(currenthomeworkdue.getDesciption()); holder.TeacherText.setText(currenthomeworkdue.getTeacher()); return convertView; } } }
Este es el código de la actividad que se inicia cuando se hace clic en un elemento de vista de lista
import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.widget.TextView; import static com.bernard.beaconportal.Due_Today_Fragment.KEY_HOMEWORK; import static com.bernard.beaconportal.Due_Today_Fragment.KEY_DESC; public class homeworkdueDetailsActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_details); String homework = ""; String desc = ""; Intent intent = getIntent(); if (null != intent) { homework = intent.getStringExtra(KEY_HOMEWORK); desc = intent.getStringExtra(KEY_DESC); } TextView headlineTxt = (TextView) findViewById(R.id.texthomeworkdue); headlineTxt.setText(homework); TextView pubdateTxt = (TextView) findViewById(R.id.textdescription); pubdateTxt.setText(desc); } }
Aquí está el código para el fragmento de pestañas
import java.lang.reflect.Field; import com.actionbarsherlock.app.SherlockFragment; import com.astuetz.PagerSlidingTabStrip; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class Fragments2 extends SherlockFragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.viewpager_main, container, false); // Locate the ViewPager in viewpager_main.xml ViewPager pager = (ViewPager) view.findViewById(R.id.viewPager); // Set the ViewPagerAdapter into ViewPager pager.setAdapter(new ViewPagerAdapter(getChildFragmentManager())); PagerSlidingTabStrip tabs = (PagerSlidingTabStrip) view.findViewById(R.id.pagerTabStrip); tabs.setViewPager(pager); return view; } @Override public void onDetach() { super.onDetach(); try { Field childFragmentManager = Fragment.class .getDeclaredField("mChildFragmentManager"); childFragmentManager.setAccessible(true); childFragmentManager.set(this, null); } catch (NoSuchFieldException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } }
Aquí es donde las cuerdas se definen para la tarea debida
public class homeworkdue { private String homework; private String desc; private int IconID; private String teacher; public homeworkdue(String homework, String desc, int IconID, String teacher) { super(); this.homework = homework; this.desc = desc; this.IconID = IconID; this.teacher = teacher; } public String getHomeworkdue() { return homework; } public String getDesciption() { return desc; } public int getIconID() { return IconID; } public String getTeacher() { return teacher; } }
Aquí está el código para el fragmento que está contenido en cinco pestañas
import java.util.ArrayList; import java.util.List; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; public class Thursday extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ return inflater.inflate(R.layout.schedule_list_view, container, false); } private List<schedule> myschedule = new ArrayList<schedule>(); static class ViewHolder { public TextView HomeworkDueText; } public void onStart() { super.onStart(); populatescheduleList(); populateListView(); } private void populatescheduleList() { myschedule.add(new schedule("E Band")); myschedule.add(new schedule("G Band")); myschedule.add(new schedule("F Band")); myschedule.add(new schedule("H Band")); myschedule.add(new schedule("A Band")); myschedule.add(new schedule("C Band")); myschedule.add(new schedule("D Band")); } private void populateListView() { ArrayAdapter<schedule> adapter = new MyListAdapter(); ListView list = (ListView)getView().findViewById(R.id.listView2); list.setAdapter(adapter); } public class MyListAdapter extends ArrayAdapter<schedule> { public MyListAdapter() { super(getActivity(), R.layout.item_view, myschedule); } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView==null){ convertView = getActivity().getLayoutInflater().inflate(R.layout.schedule_list_item, parent, false); holder = new ViewHolder(); holder.HomeworkDueText = (TextView) convertView.findViewById(R.id.bandText); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } schedule currenthomeworkdue = myschedule.get(position); holder.HomeworkDueText.setText(currenthomeworkdue.Band()); return convertView; } } }
Aquí es donde las cadenas se definen para el horario
public class schedule { private String band; public schedule(String band) { super(); this.band = band; } public String Band() { return band; } }
Si necesita más información solo pregunte y gracias de antemano por la ayuda
He estado tratando de arreglar este error durante dos días y estoy en mi ingenio final.
- Android 5.0 tablas de diseño de materiales
- ¿Cómo mostrar el contador de notificaciones no leído en Tabs dentro de TabLayout?
- Problema con el espacio en blanco de Android TabWidget
- Comunicarse entre diferentes instancias del mismo fragmento
- Cómo abrir pestaña en Espresso
- Separa la pila trasera de cada pestaña en Android mediante Fragmentos
- Añadir pestañas a la izquierda con FragmentPagerAdapter
- Tabhost- establece la posición de la divisa en pestañas Android
La razón detrás de que estamos declarando una nueva lista una vez que se crea el fragmento, por lo que cuando regrese a su fragmento no va a declarar una nueva, en su lugar se utilizará la antigua. Por lo que para abordar este problema es necesario dividir el código siguiente en 2 partes:
private List<homeworkdue> myhomeworkdue = new ArrayList<homeworkdue>();
Parte va en onResume
en su fragmento que usted necesita también para quitar onStart
y todo en onStart
a onResume
. Pero primero mantenga la declaración como esta:
private List<homeworkdue> myhomeworkdue;
Y mover el resto a onResume
.
@Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); myhomeworkdue = new ArrayList<homeworkdue>(); populatehomeworkdueList(); populateListView(); registerClickCallback(); }
Mismo problema en su segundo ListView
ya que son idénticos.
Espero que esto funcione para usted. Por favor déme una regeneración si trabajó.
O simplemente simplemente llame al método clear()
; Sin ella, permanece constantemente ahí mientras llama a nuevos datos.
- Espere hasta que la vista sea visible con IdleResource
- Fondo de la aplicación de Android: uso de múltiples imágenes