2017-09-27 2 views
0

Ma ligne listview personnalisée a un bouton Supprimer. J'essaie de supprimer un élément spécifique dans listview avec ce bouton de suppression. (Supprimer de l'action des favoris). Je peux supprimer l'élément sélectionné mais le reste de la liste (éléments sous l'élément sélectionné) en supprimant avec lui. La partie supérieure reste toujours. Comment puis-je réparer cela? Merci d'avance.Suppression d'un élément sélectionné avec le reste de la liste dans un problème de listview personnalisé

FavoriteListAdapter:

public class FavoritesListAdapter extends ArrayAdapter<String> { 

    private Activity context; 
    private List<String> radioName; 
    private List<String> listenerNumbers; 

    public FavoritesListAdapter(Activity context, List<String> radioName, List<String> listenerNumbers) { 
     super(context, R.layout.custom_favorites_listview, radioName); 

     this.context=context; 
     this.radioName=radioName; 
     this.listenerNumbers=listenerNumbers; 
    } 

    @NonNull 
    @Override 
    public View getView(final int position, View convertView, final ViewGroup parent) { 

     View r= convertView; 
     FavoritesViewHolder viewHolder = null; 

     if (r == null) { 
      LayoutInflater layoutInflater= context.getLayoutInflater(); 
      r= layoutInflater.inflate(R.layout.custom_favorites_listview,null,true); 
      viewHolder = new FavoritesViewHolder(r); 
      r.setTag(viewHolder); 
     } 

     else { 
      viewHolder = (FavoritesViewHolder) r.getTag(); 
     } 

     viewHolder.row_tv_favorites_radio_name.setText(radioName.get(position)); 
     viewHolder.row_img_favorites_radio_icon.setImageResource(R.drawable.radio_logo_renkli); 
     viewHolder.row_tv_favorites_listener_numbers.setText("Listeners : " + listenerNumbers.get(position)); 

     viewHolder.button_remove_from_favorites_list.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       listenerNumbers.remove(position); 
       radioName.remove(position); 

       SharedPreferences settings = context.getSharedPreferences("PREFS", 0); 
       final SharedPreferences.Editor editor = settings.edit(); 
       editor.remove("radio_link"+ position); 
       editor.remove("radio_name" + position); 
       editor.remove("listener_number" + position); 
       // editor.clear(); 
       editor.commit(); 
       // FavoritesFragment.radio_name_list.remove(position); 
       // FavoritesFragment.radio_link_list.remove(position); 
       // FavoritesFragment.listener_numbers.remove(position); 
       notifyDataSetChanged(); 
      } 
     }); 

     return r; 

    } 

    class FavoritesViewHolder { 
     TextView row_tv_favorites_radio_name; 
     TextView row_tv_favorites_listener_numbers; 
     ImageView row_img_favorites_radio_icon; 
     Button button_remove_from_favorites_list; 
     FavoritesViewHolder(View v) { 
      row_tv_favorites_radio_name= (TextView) v.findViewById(R.id.txt_radio_name_favorites); 
      row_tv_favorites_listener_numbers = (TextView) v.findViewById(R.id.txt_listener_numbers_favorites); 
      row_img_favorites_radio_icon = (ImageView) v.findViewById(R.id.img_radio_icon_favorites); 
      button_remove_from_favorites_list = (Button) v.findViewById(R.id.remove_favorites_from_list_button); 
     } 
    } 

} 

Dans mon PlayRadioFragment, les utilisateurs ont ajouter un bouton de favori, et les valeurs envoyées FavoritesFragment avec des touches uniques

public static int incrementedValue = 0; 



    SharedPreferences settings = getActivity().getSharedPreferences("PREFS", 0); 
     final SharedPreferences.Editor editor = settings.edit(); 

     add_favorites_button= (Button) view.findViewById(R.id.add_favorites_button); 
     add_favorites_button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 

       editor.putString("radio_link"+ incrementedValue, radio_play_link); 
       editor.putString("radio_name" + incrementedValue, radio_name); 
       editor.putString("listener_number" + incrementedValue, listener_number); 
       // editor.clear(); 
       editor.commit(); 

       incrementedValue++; 
      } 

     }); 

Et voici mon FavoritesFragment:

public class FavoritesFragment extends Fragment { 



    public static FavoritesListAdapter adapter_2; 

    public FavoritesFragment() { 
     // Required empty public constructor 
    } 

    TextView radio_name_txt, radio_link_txt; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view= inflater.inflate(R.layout.fragment_favorites, container, false); 


     final List<String> radio_name_list = new ArrayList<>(); 
     final List<String> radio_link_list = new ArrayList<>(); 
     final List<String> listener_numbers = new ArrayList<>(); 



     for (int i=0; i<Integer.MAX_VALUE; i++) { 
      SharedPreferences settings = getActivity().getSharedPreferences("PREFS",0); 
      String radio_name = settings.getString("radio_name" +i, ""); 
      String radio_link = settings.getString("radio_link" +i, ""); 
      String listener_number = settings.getString("listener_number" +i, ""); 

      if (TextUtils.isEmpty(radio_name)){break;} 
      else {radio_name_list.add(radio_name);} 

      if (TextUtils.isEmpty(radio_link)){break;} 
      else {radio_link_list.add(radio_link);} 

      listener_numbers.add(listener_number); 
     } 



     PlayRadioFragment.incrementedValue = radio_name_list.size(); 

     ListView listView_favorites = (ListView) view.findViewById(R.id.listview_favorites); 
     adapter_2 = new FavoritesListAdapter(getActivity(), radio_name_list, listener_numbers); 
     listView_favorites.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 
       PlayRadioFragment fragment= new PlayRadioFragment(); 
       Bundle bundle= new Bundle(); 
       FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction(); 
       bundle.putString("radio_play_links", radio_link_list.get(position)); 
       bundle.putString("radio_name", radio_name_list.get(position)); 
       bundle.putString("listener_number", listener_numbers.get(position)); 
       fragment.setArguments(bundle); 
       fragmentTransaction.addToBackStack(null); 
       fragmentTransaction.replace(R.id.frame_layout,fragment); 
       fragmentTransaction.commit(); 

      } 
     }); 
     listView_favorites.setAdapter(adapter_2); 



     return view; 
    } 
+0

Voulez-vous supprimer l'élément ou le supprimer des favoris? – YoLo

+0

Ce serait génial, mais je ne pouvais pas faire comme ça. Donc j'essaye de supprimer le favori sélectionné sur listview. – PinkRabbits

+0

Pouvez-vous utiliser la classe d'objets S'il vous plaît, il va rendre le travail plus facile – YoLo

Répondre

2

Créez votre classe d'objets comme:

public class DemoGson { 

    private String radio_link,radio_name,listener_number; 

    public String getRadio_link() { 
     return radio_link; 
    } 

    public void setRadio_link(String radio_link) { 
     this.radio_link = radio_link; 
    } 

    public String getRadio_name() { 
     return radio_name; 
    } 

    public void setRadio_name(String radio_name) { 
     this.radio_name = radio_name; 
    } 

    public String getListener_number() { 
     return listener_number; 
    } 

    public void setListener_number(String listener_number) { 
     this.listener_number = listener_number; 
    } 
} 

lors de l'ajout de données à elle créer nouvel objet et ajouter des données puis insérez cet objet particulier à Arraylist et passer arraylist à votre adaptateur

ArrayList<DemoGson> arrayList = new ArrayList<>(); 

     DemoGson demoGson = new DemoGson(); 
     demoGson.setRadio_link("yourlink"); 
     demoGson.setRadio_name("yourname"); 
     demoGson.setListener_number("2"); 

     arrayList.add(demoGson); 

puis

adapter_2 = new FavoritesListAdapter(getActivity(),arrayList); 

et dans l'adaptateur il suffit de retirer la position de votre arraylist

1

Cela ne supprime pas non élément de l'adaptateur, que de vos tableaux personnalisés:

listenerNumbers.remove(position); 
radioName.remove(position); 

En plus, vous devez supprimer l'élément de la ArrayList interne de l'adaptateur. Faites comme ceci:

remove(getItem(position)); 

En général, ce n'est pas bonne approche pour gérer 2 tableaux personnalisés parallèles dans l'adaptateur (listenerNumbers, radioname dans votre cas). Mieux vaut définir la classe Item, contenant ces deux champs, et fournir ArrayList des objets de cette classe à l'adaptateur en tant que paramètre (au lieu de tableau de chaînes comme dans votre cas). Et aussi mettre en œuvre XML pour l'élément, qui aura les deux éléments (TextView et RadioButton).

+0

J'ai également essayé d'enlever des éléments de l'Arraylist de l'adaptateur. // FavoritesFragment.radio_name_list.remove (position); // FavoritesFragment.radio_link_list.remove (position); // FavoritesFragment.listener_numbers.remove (position). Mais ce n'est pas une solution pour mon problème principal, Alors, il semble que je dois essayer d'autres méthodes. Merci encore – PinkRabbits

+0

Encore une fois, supprimer des éléments du tableau ne les retirera pas de l'adaptateur. Ce que j'ai suggéré ci-dessus - exécute la méthode interne de l'adaptateur. Il est également appelé supprimer, mais il accepte l'objet lui-même, pas l'index/position.Permet de le faire en deux lignes: Chaîne remItem = getItem (position); remove (remItem); espérons que cela clarifie le problème. – Cadet