【问题标题】:selected item deleting with the rest of list in custom listview trouble自定义列表视图问题中的选定项目与列表的其余部分一起删除
【发布时间】:2018-03-08 19:35:12
【问题描述】:

我的自定义列表视图行有删除按钮。我正在尝试使用此删除按钮删除列表视图中的特定项目。 (从收藏夹动作中删除)。我可以删除所选项目,但列表的其余部分(所选项目下的项目)会随之删除。顶部仍然存在。我怎样才能解决这个问题?提前致谢。

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);
        }
    }

}

在我的 PlayRadioFragment 中,用户添加了收藏按钮,并将值发送到带有唯一键的收藏夹片段

 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++;
            }

        });

这是我的收藏夹片段:

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;
    }

【问题讨论】:

  • 您要删除项目还是将其从收藏夹中删除?
  • 会很棒,但我做不到。所以我正在尝试删除列表视图上选定的收藏夹。
  • 你可以使用Object类吗?它会让工作更轻松
  • 我是安卓新手,不知道怎么用。如果不需要很长时间,你能告诉我我的代码吗?

标签: android listview sharedpreferences


【解决方案1】:

将您的对象类创建为:

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;
    }
}

在向其添加数据时创建新对象并添加数据,然后将该特定对象插入到 arraylist 并将 arraylist 传递给您的适配器

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

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

        arrayList.add(demoGson);

然后

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

在适配器中只需从您的数组列表中删除位置

【讨论】:

    【解决方案2】:

    这不会从适配器中删除元素,只会从您的自定义数组中删除:

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

    此外,您需要从适配器的内部 ArrayList 中删除该项目。这样做:

    remove(getItem(position));
    

    通常,在适配器中管理 2 个并行自定义数组(在您的情况下为 listenerNumbers、radioName)并不是一个好方法。最好定义包含这两个字段的 Item 类,并将此类对象的 ArrayList 作为参数提供给适配器(而不是像您的情况那样的字符串数组)。并且还为项目实现支持 XML,这将具有两个项目(TextView 和 RadioButton)。

    【讨论】:

    • 我还尝试从适配器的 Arraylist 中删除元素。 // FavoritesFragment.radio_name_list.remove(position); // 收藏夹Fragment.radio_link_list.remove(position); // FavoritesFragment.listener_numbers.remove(position).但这不是我主要问题的解决方案,所以,看起来我必须尝试其他方法。谢谢
    • 再一次,从数组中删除项目不会将它们从适配器中删除。我上面的建议 - 运行适配器的内部方法。它也称为删除,但它接受对象本身,而不是索引/位置。让我们分两行来做: String remItem = getItem(position);删除(remItem);希望它能澄清问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多