Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在ListView中实现删除按钮并从数据库中删除?_Java_Android_Listview_Fragment_Adapter - Fatal编程技术网

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

Java 如何在ListView中实现删除按钮并从数据库中删除?,java,android,listview,fragment,adapter,Java,Android,Listview,Fragment,Adapter,我对android非常陌生,有人给了我一个预先编写好的应用程序,我必须改进。我必须做的一件事是在ListView中的每个项目中添加一个delete按钮。 以下是my ListView元素的XML: LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="50dp" an

我对android非常陌生,有人给了我一个预先编写好的应用程序,我必须改进。我必须做的一件事是在ListView中的每个项目中添加一个delete按钮。 以下是my ListView元素的XML:

LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:descendantFocusability="blocksDescendants"
    android:orientation="horizontal" >

<ImageView
    android:id="@+id/li_map_image"
    android:layout_width="50dp"
    android:layout_height="match_parent"
    android:contentDescription="thumbnail" />

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

<ImageButton
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:id="@+id/delete"
    android:focusableInTouchMode="true"
    android:background="@drawable/red_x"
    android:layout_gravity="center|left"
    android:onClick="deleteMap"></ImageButton>
LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android"
android:layout\u width=“匹配父项”
android:layout_height=“50dp”
android:genderantfocusability=“blocksDescendants”
android:orientation=“horizontal”>

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

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

}
公共类MapListFragment扩展ListFragment实现
LoaderManager.LoaderCallbacks{
私有静态最终整数加载器_ID=1;
私有静态最终字符串[]FROM={Database.Maps.DATA,
Database.Maps.NAME};
私有静态最终字符串[]游标\列={Database.Maps.ID,
Database.Maps.DATA,Database.Maps.NAME};
私有静态final int[]TO={R.id.li\u map\u image,R.id.li\u map\u name};
私人简易程序或适应程序;
//这不是没必要吗?
公共MapListFragment(){
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//修正我颠倒顺序,使最新的会话位于顶部
mAdapter=new SimpleCursorAdapter(getActivity(),
R.layout.map\u list\u项,null,FROM,TO,0);
mAdapter.setViewBinder(新的SimpleCursorAdapter.ViewBinder(){
@凌驾
公共布尔值setViewValue(视图、光标、,
int列(索引){
if(view.getId()==R.id.li\u map\u image){
((ImageView)视图).setImageURI(Uri.parse(游标
.getString(columnIndex));
返回true;
}
返回false;
}
});
setListAdapter(mAdapter);
getLoaderManager().initLoader(LOADER_ID,null,this);
}
@凌驾
public void onListItemClick(列表视图列表、视图v、整数位置、长id){
最终意图nextIntent=新意图(getActivity(),
ViewMapActivity.class);
nextint.putExtra(Utils.Constants.MAP\u ID\u EXTRA,ID);
startActivity(nextentint);
}
@凌驾
公共加载器onCreateLoader(int-id,Bundle-args){
返回新的游标装入器(getActivity(),DataProvider.MAPS\u URI,
光标_列,null,null,null);
}
@凌驾
public void onLoadFinished(加载器,光标){
if(loader.getId()==loader\u ID)
mAdapter.swapCursor(光标);
}
@凌驾
公共void onLoaderReset(加载器){
mAdapter.swapCursor(空);
}
}

对于如何实现这个删除功能,我感到非常困惑。任何帮助都将不胜感激:)

这是一个关于如何在listview中的按钮上放置clicklistener的非常好的教程

跟随

在AdapterGetView方法中,您需要像下面这样将ClickListener放在按钮上

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

在Listview中添加Longclicklistner

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


在“删除”按钮上设置适配器的getView方法内部的
onClickListener
。这让我很困惑,因为我在给出的代码中没有看到at getView方法,并且在尝试添加时它不起作用。你有listview的基本适配器类吗。。。?如果是,则在该类中添加
setOnClickListener
代码。