如何在 ListView 中实现删除按钮并从数据库中删除?

Posted

技术标签:

【中文标题】如何在 ListView 中实现删除按钮并从数据库中删除?【英文标题】:How can I implement a delete button in a ListView and delete from database? 【发布时间】:2015-08-25 03:34:09 【问题描述】:

我对 android 很陌生,我得到了一个我必须改进的预先编写的应用程序。我必须做的一件事是为 ListView 中的每个项目添加一个删除按钮。 这是我的 ListView 元素的 XML:

LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:descendantFocusability="blocksDescendants"
    android:orientation="horizontal" >

<ImageView
    android:id="@+id/li_map_image"
    android:layout_
    android:layout_
    android:contentDescription="thumbnail" />

<TextView
    android:id="@+id/li_map_name"
    android:layout_
    android:layout_
    android:layout_gravity="center_vertical"
    android:layout_weight="1"
    android:paddingLeft="8dp"
    android:textSize="16sp" />

<ImageButton
    android:layout_
    android:layout_
    android:id="@+id/delete"
    android:focusableInTouchMode="true"
    android:background="@drawable/red_x"
    android:layout_gravity="center|left"
    android:onClick="deleteMap"></ImageButton>

基本上,如果用户想删除 ListView 中的一行,我希望用户单击删除图标。此外,这应该从数据库中删除项目的数据。我对如何实现这一点感到非常困惑,因为我不知道如何知道他们正在单击哪个删除按钮。此外,当我将 ImageButton 添加到 ListView 代码时,它告诉我在 main 中创建 onClick 方法(应该在 main 中吗?);但是我如何才能从数据库中删除数据?此外,Main Activity 有一个 Fragment 获取 ListView 代码。这是 Fragment 类:

public class MapListFragment extends ListFragment implements
        LoaderManager.LoaderCallbacks<Cursor> 

    private static final int LOADER_ID = 1;
    private static final String[] FROM =  Database.Maps.DATA,
            Database.Maps.NAME ;
    private static final String[] CURSOR_COLUMNS =  Database.Maps.ID,
            Database.Maps.DATA, Database.Maps.NAME ;
    private static final int[] TO =  R.id.li_map_image, R.id.li_map_name ;

    private SimpleCursorAdapter mAdapter;

    // FIXME isn't this unnecessary?
    public MapListFragment() 
    

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        // FIXME reverse the order so the newest sessions are at the top
        mAdapter = new SimpleCursorAdapter(getActivity(),
                R.layout.map_list_item, null, FROM, TO, 0);
        mAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() 
            @Override
            public boolean setViewValue(View view, Cursor cursor,
                    int columnIndex) 
                if (view.getId() == R.id.li_map_image) 
                    ((ImageView) view).setImageURI(Uri.parse(cursor
                            .getString(columnIndex)));
                    return true;
                
                return false;
            
        );
        setListAdapter(mAdapter);

        getLoaderManager().initLoader(LOADER_ID, null, this);
    

    @Override
    public void onListItemClick(ListView list, View v, int position, long id) 
        final Intent nextIntent = new Intent(getActivity(),
                ViewMapActivity.class);
        nextIntent.putExtra(Utils.Constants.MAP_ID_EXTRA, id);
        startActivity(nextIntent);
    


    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) 
        return new CursorLoader(getActivity(), DataProvider.MAPS_URI,
                CURSOR_COLUMNS, null, null, null);
    

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) 
        if (loader.getId() == LOADER_ID)
            mAdapter.swapCursor(cursor);
    

    @Override
    public void onLoaderReset(Loader<Cursor> loader) 
        mAdapter.swapCursor(null);
    


我对如何实现此删除功能感到非常迷茫。任何帮助将不胜感激:)

【问题讨论】:

在适配器的 getView 方法中设置 onClickListener 删除按钮。 【参考方案1】:

这里有一个很好的教程,介绍如何在列表视图内的按钮上放置点击监听器。

关注this link

在您的适配器 getView 方法中,您需要像这样将点击监听器放在按钮上

@Override  
public View getView(final int position, View convertView, ViewGroup parent)   
    ViewHolder viewHolder;  
    if (convertView == null)   
        LayoutInflater inflater = LayoutInflater.from(context);  
        convertView = inflater.inflate(R.layout.child_listview, null);  
        viewHolder = new ViewHolder();  
        viewHolder.text = (TextView) convertView  
                .findViewById(R.id.childTextView);  
        viewHolder.button = (Button) convertView  
                .findViewById(R.id.childButton);  
        convertView.setTag(viewHolder);  
     else   
        viewHolder = (ViewHolder) convertView.getTag();  
      
    final String temp = getItem(position);  
    viewHolder.text.setText(temp);  
    viewHolder.button.setOnClickListener(new OnClickListener()   

        @Override  
        public void onClick(View v)   
            if (customListner != null)   
                customListner.onButtonClickListner(position,temp);  
              

          
    );  

    return convertView;  
  

【讨论】:

这让我很困惑,因为我在给定的代码中没有看到 getView 方法,当我尝试添加一个时它也不起作用。 你有你的列表视图的基本适配器类...?如果是,请在该类中添加setOnClickListener 代码。【参考方案2】:

在您的列表视图中添加 Longclicklistner

试试这个,可能对你有帮助

Link

【讨论】:

以上是关于如何在 ListView 中实现删除按钮并从数据库中删除?的主要内容,如果未能解决你的问题,请参考以下文章

在android的listview中实现音频播放器

如何从 ListView 中删除项目而不从数据库中删除它?

如何用CheckBox在Listview中实现删除线文本?

如何在swift 5中实现滑动中的两个垂直按钮以删除

如何在反应中实现 AG 网格行内的按钮

如何在 simpleadapter 中实现 OnItemClickListener?代码删除、更新等,