Android:无法从菜单中删除ListView项目

时间:2017-08-05 06:04:19

标签: android listview

我是新来的,所以请忍受我的天真。我正在制作一个音乐播放器,它会在listview项目中点击'dots'按钮(在下面的代码中给出)显示一个菜单。菜单内部会有一个要删除的按钮。列表视图将由自定义适配器填充。这是适配器的代码......

   private class hashmapAdapter extends BaseAdapter implements Filterable {
HashMap<Integer, NowPlayingActivity.Details> NewDetails = new HashMap<>();

private hashmapAdapter(HashMap<Integer, NowPlayingActivity.Details> hashMap) {
    if(NewDetails.size()==0) {
        NewDetails.putAll(hashMap);
    }
}

@Override
public int getCount() {
    return NewDetails.size();
}

@Override
public Object getItem(int position) {
    return NewDetails.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

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

    if(convertView == null) {
        result = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_item,parent,false);
    } else {
        result = convertView;
    }

    ((TextView)result.findViewById(R.id.Name)).setText(NewDetails.get(position).getName());
    ((TextView)result.findViewById(R.id.artist)).setText(NewDetails.get(position).getArtist());
    ((TextView)result.findViewById(R.id.duration)).setText(NewDetails.get(position).getDuration()+" || ");

    dots = (Button)result.findViewById(R.id.dots);
    dots.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            name = (TextView)result.findViewById(R.id.Name);

            LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
            View popup_view = inflater.inflate(R.layout.option_layout,null);
            RelativeLayout item = (RelativeLayout) popup_view.findViewById(R.id.popup);

            final float width= (getResources().getDimension(R.dimen.width_entry_in_dp));
            final float height= getResources().getDimension(R.dimen.height_entry_in_dp);
            final PopupWindow popupWindow  = new PopupWindow(popup_view,Math.round(width),Math.round(height),true);

            popupWindow.showAtLocation(item, Gravity.END, 0, 0);
            popupWindow.showAsDropDown(dots);

            play_next_btn = (Button)popup_view.findViewById(R.id.play_next);
            add_to_playlist = (Button)popup_view.findViewById(R.id.add_to_playlist);
            share = (Button)popup_view.findViewById(R.id.share);
            delete = (Button)popup_view.findViewById(R.id.delete);

            delete.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    for(int i=0;i<NewDetails.size();i++) {
                        if(NewDetails.get(i).getName().equals(name.getText().toString())) {
                            for(int j=0;j<hashMap.size();j++) {
                                if(hashMap.get(j).getName().equals(name.getText().toString())) {
                                    if (true) {
                                        NewDetails.remove(i);
                                        hashMap.remove(j);

                                    }
                                }
                            }
                        }
                    }
                    populate1(NewDetails);
                    popupWindow.dismiss();
                }
            });

        }
    });

    return result;}

现在的问题是,当我调用populate1(NewDetails)时删除元素后,它会在NewDetails.get(position).getName()上给出一个空指针异常。所以在重新填充listview时我得到了NPE错误。以下是populate1()函数代码......

 public void populate1(HashMap<Integer,NowPlayingActivity.Details> hashMap) {

    adapter = new hashmapAdapter(hashMap);
    library.setAdapter(adapter);
    adapter.notifyDataSetChanged();
    library.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            name = (TextView)view.findViewById(R.id.Name);
            String SongName = name.getText().toString();
            Intent intent = new Intent(getApplicationContext(),NowPlayingActivity.class);
            intent.putExtra("SongName",SongName);
            setResult(555,intent);
            finish();
        }
    });
}

我已经尝试过notifydatasetchanged()和listview.invalidateviews(),两者都没有用。文件被删除但适配器没有刷新列表以删除元素。这是listview的single_item的xml布局....`

`<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="wrap_content"
    android:layout_height="70dp"
    android:paddingRight="8dp"
    android:paddingEnd="8dp"
    android:background="@drawable/element_shape_list"
    android:descendantFocusability="blocksDescendants">

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/v1"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_centerVertical="true"
        android:foreground="?android:attr/selectableItemBackground">

        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/v11"
            android:orientation="horizontal" android:layout_width="wrap_content"
            android:layout_height="match_parent">

            <ImageView
                android:id="@+id/art_work"
                android:layout_width="60dp"
                android:layout_height="60dp"
                android:layout_centerVertical="true"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:background="@mipmap/ic_launcher"
                android:layout_marginLeft="5dp"
                android:layout_marginStart="5dp"/>

            <TextView
                android:id="@+id/Name"
                android:textSize="17sp"
                android:textColor="#000"
                android:textStyle="bold"
                android:gravity="bottom"
                android:layout_width="match_parent"
                android:layout_height="30dp"
                android:layout_marginTop="10dp"
                android:layout_marginLeft="5dp"
                android:layout_marginStart="5dp"
                android:layout_marginRight="30dp"
                android:layout_marginEnd="30dp"
                android:layout_toRightOf="@id/art_work"
                android:layout_toEndOf="@+id/art_work"
                android:singleLine="true"
                />

            <RelativeLayout
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="20dp"
                android:layout_marginLeft="5dp"
                android:layout_marginStart="5dp"
                android:layout_marginRight="30dp"
                android:layout_marginEnd="30dp"
                android:layout_marginBottom="10dp"
                android:layout_toRightOf="@+id/art_work"
                android:layout_toEndOf="@id/art_work"
                android:layout_below="@id/Name">

                <TextView
                    android:id="@+id/duration"
                    android:textSize="12sp"
                    android:textColor="#000"
                    android:layout_width="wrap_content"
                    android:layout_alignParentStart="true"
                    android:layout_alignParentLeft="true"
                    android:layout_height="20dp"
                    android:singleLine="true"
                    android:gravity="clip_horizontal"
                    android:ellipsize="end"/>

                <TextView
                    android:id="@+id/artist"
                    android:textSize="12sp"
                    android:textColor="#000"
                    android:layout_toRightOf="@+id/duration"
                    android:layout_toEndOf="@+id/duration"
                    android:layout_alignParentEnd="true"
                    android:layout_alignParentRight="true"
                    android:layout_width="wrap_content"
                    android:gravity="fill_horizontal"
                    android:layout_height="20dp"
                    android:singleLine="true" />

                </RelativeLayout>

        </RelativeLayout>

    </FrameLayout>

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/holder"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_centerVertical="true"
        android:background="@android:color/transparent">

        <Button
            android:id="@+id/dots"
            android:layout_width="40dp"
            android:textStyle="bold"
            android:background="?android:attr/selectableItemBackground"
            android:layout_height="70dp"
            android:text="@string/vertical_ellipsis"
            android:textSize="25sp" />

    </FrameLayout>

</RelativeLayout>

0 个答案:

没有答案