Java 使用OnClickListener on按钮在Android中返回列表中的位置

Java 使用OnClickListener on按钮在Android中返回列表中的位置,java,android,android-listview,Java,Android,Android Listview,我在网上查过了,一定是遗漏了什么。我的任务似乎很简单,我已经找到了一些其他类似的职位,但我还没有能够让我的工作。下面是我的代码(对不起,我是java和android新手,所以如果我做了一些不是最佳实践的事情,我道歉。)无论如何,我的情况 我有一个从数据库填充一些文本字段的列表视图,在这些文本框的右侧,我创建了一个删除按钮,希望在按下相应的删除按钮时删除该记录(行)。我已成功为我的按钮创建了OnClickListener,但无法在列表视图中获取按钮已被单击的位置 -----------------

我在网上查过了,一定是遗漏了什么。我的任务似乎很简单,我已经找到了一些其他类似的职位,但我还没有能够让我的工作。下面是我的代码(对不起,我是java和android新手,所以如果我做了一些不是最佳实践的事情,我道歉。)无论如何,我的情况

我有一个从数据库填充一些文本字段的列表视图,在这些文本框的右侧,我创建了一个删除按钮,希望在按下相应的删除按钮时删除该记录(行)。我已成功为我的按钮创建了OnClickListener,但无法在列表视图中获取按钮已被单击的位置

---------------------------------------------------
TextView  TextView    | Delete Button
---------------------------------------------------
TextView  TextView    | Delete Button
---------------------------------------------------
代码:

我已经看过很多例子,很多时候它们都是针对阵列适配器的,我发现的另一件事是有些人会重写getView函数,我的印象是,你可以不这样做就执行上述任务。此外,我不希望列表项iteslef是可点击的,只是按钮。。。这似乎应该是一个如此简单的问题,但我一直在寻找。。。我很抱歉,如果这是涵盖了很好的地方,我刚刚错过了它,我已经花了过去4个小时搜索网页试图找到一个修复

无论如何,任何帮助都将不胜感激


谢谢。

马拉奇的链接为您指明了正确的方向。只缺少一个小细节。 游标有一个方法getPosition(),该方法返回游标在行集中的位置。 将该值存储在您的ViewHolder中,即可设置:

holder.position = c.getPosition();
在OnClickListener中,检索ViewHolder及其包含的位置:

ViewHolder holder = (ViewHolder) v.getTag();
int position = holder.position;
该位置可用于检索基础数据:

Object myData = getItem(position);

要在列表中只单击按钮,只需在ListView\u row.xml中设置按钮的属性即可

现在,您可以为按钮和Listview分离单击事件

此外,在listview中进行自定义时,调用getView()是构建listview的最佳实践。查看视频教程。我敢肯定,你永远不会忘记,你将从本教程中学习

这就是我如何从listview中删除多个项目的方法,不同之处在于我没有从列表中删除任何项目,而是从数据库中删除与其相关的记录,并且我使用了imageview,而不是按钮。至少你可以知道怎么做:

public class DeleteData extends Activity {

Cursor cursor;
ListView lv_delete_data;
static ArrayList<Integer> listOfItemsToDelete;
SQLiteDatabase database;
private Category[] categories;
ArrayList<Category> categoryList;
private ArrayAdapter<Category> listAdapter;
ImageView iv_delete;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_delete_data);

    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    manage_reload_list();

    listOfItemsToDelete = new ArrayList<Integer>();

    iv_delete = (ImageView) findViewById(R.id.imageViewDeleteDataDelete);
    iv_delete.setClickable(true);
    iv_delete.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (listOfItemsToDelete.isEmpty()) {

                Toast.makeText(getBaseContext(), "No items selected.",
                        Toast.LENGTH_SHORT).show();
            }

            else {
                showDialog(
                        "Warning",
                        "Are you sure you want to delete these categories ? This will erase all records attached with it.");
            }
        }
    });

    lv_delete_data = (ListView) findViewById(R.id.listViewDeleteData);
    lv_delete_data.setAdapter(listAdapter);
    lv_delete_data.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub
            ImageView imageView = (ImageView) arg1
                    .findViewById(R.id.imageViewSingleRowDeleteData);
            Category category = (Category) imageView.getTag();

            if (category.getChecked() == false) {
                imageView.setImageResource(R.drawable.set_check);
                listOfItemsToDelete.add(category.getId());
                category.setChecked(true);
            } else {
                imageView.setImageResource(R.drawable.set_basecircle);
                listOfItemsToDelete.remove((Integer) category.getId());
                category.setChecked(false);
            }
        }
    });
}

private void showDialog(final String title, String message) {

    AlertDialog.Builder adb = new Builder(DeleteData.this);
    adb.setTitle(title);
    adb.setMessage(message);
    adb.setIcon(R.drawable.ic_launcher);
    String btn = "Ok";
    if (title.equals("Warning")) {
        btn = "Yes";
        adb.setNegativeButton("No", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
    }

    adb.setPositiveButton(btn, new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface arg0, int arg1) {

            if (title.equals("Warning")) {

                for (int i : listOfItemsToDelete) {

                    // -------first delete from category table-----

                    database.delete("category_fields", "cat_id=?",
                            new String[] { i + "" });

                    // --------now fetch rec_id where cat_id =
                    // i-----------------

                    cursor = database.query("records_data",
                            new String[] { "rec_id" }, "cat_id=?",
                            new String[] { i + "" }, null, null, null);
                    if (cursor.getCount() == 0)
                        cursor.close();
                    else {
                        ArrayList<Integer> al_tmp_rec_id = new ArrayList<Integer>();
                        while (cursor.moveToNext())
                            al_tmp_rec_id.add(cursor.getInt(0));
                        cursor.close();

                        for (int i1 : al_tmp_rec_id) {
                            database.delete("records_fields_data",
                                    "rec_id=?", new String[] { i1 + "" });

                            database.delete("record_tag_relation",
                                    "rec_id=?", new String[] { i1 + "" });
                        }

                        // ---------delete from records_data-------

                        database.delete("records_data", "cat_id=?",
                                new String[] { i + "" });

                        cursor.close();
                    }
                }

                showDialog("Success",
                        "Categories, with their records, deleted successfully.");
            } else {
                database.close();
                listOfItemsToDelete.clear();
                manage_reload_list();
                lv_delete_data.setAdapter(listAdapter);
            }
        }
    });

    AlertDialog ad = adb.create();
    ad.show();
}

protected void manage_reload_list() {

    loadDatabase();

    categoryList = new ArrayList<Category>();

    // ------first fetch all categories name list-------

    cursor = database.query("category", new String[] { "cat_id",
            "cat_description" }, null, null, null, null, null);
    if (cursor.getCount() == 0) {
        Toast.makeText(getBaseContext(), "No categories found.",
                Toast.LENGTH_SHORT).show();
        cursor.close();
    } else {

        while (cursor.moveToNext()) {

            categories = new Category[] { new Category(cursor.getInt(0),
                    cursor.getString(1)) };
            categoryList.addAll(Arrays.asList(categories));
        }
        cursor.close();
    }
    listAdapter = new CategoryArrayAdapter(this, categoryList);
}

static class Category {

    String cat_name = "";
    int cat_id = 0;
    Boolean checked = false;

    Category(int cat_id, String name) {
        this.cat_name = name;
        this.cat_id = cat_id;
    }

    public int getId() {
        return cat_id;
    }

    public String getCatName() {
        return cat_name;
    }

    public Boolean getChecked() {
        return checked;
    }

    public void setChecked(Boolean checked) {
        this.checked = checked;
    }

    public boolean isChecked() {
        return checked;
    }

    public void toggleChecked() {
        checked = !checked;
    }
}

static class CategoryViewHolder {

    ImageView imageViewCheck;
    TextView textViewCategoryName;

    public CategoryViewHolder(ImageView iv_check, TextView tv_category_name) {
        imageViewCheck = iv_check;
        textViewCategoryName = tv_category_name;
    }

    public ImageView getImageViewCheck() {
        return imageViewCheck;
    }

    public TextView getTextViewCategoryName() {
        return textViewCategoryName;
    }
}

static class CategoryArrayAdapter extends ArrayAdapter<Category> {

    LayoutInflater inflater;

    public CategoryArrayAdapter(Context context, List<Category> categoryList) {

        super(context, R.layout.single_row_delete_data,
                R.id.textViewSingleRowDeleteData, categoryList);
        inflater = LayoutInflater.from(context);
    }

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

        Category category = (Category) this.getItem(position);

        final ImageView imageViewCheck;
        final TextView textViewCN;

        if (convertView == null) {

            convertView = inflater.inflate(R.layout.single_row_delete_data,
                    null);

            imageViewCheck = (ImageView) convertView
                    .findViewById(R.id.imageViewSingleRowDeleteData);
            textViewCN = (TextView) convertView
                    .findViewById(R.id.textViewSingleRowDeleteData);

            convertView.setTag(new CategoryViewHolder(imageViewCheck,
                    textViewCN));
        }

        else {

            CategoryViewHolder viewHolder = (CategoryViewHolder) convertView
                    .getTag();
            imageViewCheck = viewHolder.getImageViewCheck();
            textViewCN = viewHolder.getTextViewCategoryName();
        }

        imageViewCheck.setFocusable(false);
        imageViewCheck.setFocusableInTouchMode(false);
        imageViewCheck.setClickable(true);
        imageViewCheck.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                ImageView iv = (ImageView) v;
                Category category = (Category) iv.getTag();

                if (category.getChecked() == false) {
                    imageViewCheck.setImageResource(R.drawable.set_check);
                    listOfItemsToDelete.add(category.getId());
                    category.setChecked(true);
                } else {
                    imageViewCheck
                            .setImageResource(R.drawable.set_basecircle);
                    listOfItemsToDelete.remove((Integer) category.getId());
                    category.setChecked(false);
                }
            }
        });
        imageViewCheck.setTag(category);

        if (category.getChecked() == true)
            imageViewCheck.setImageResource(R.drawable.set_check);
        else
            imageViewCheck.setImageResource(R.drawable.set_basecircle);

        textViewCN.setText(category.getCatName());

        return convertView;
    }
}

private void loadDatabase() {
    database = openOrCreateDatabase("WalletAppDatabase.db",
            SQLiteDatabase.OPEN_READWRITE, null);
}
}
公共类DeleteData扩展活动{
光标;
ListView lv_删除_数据;
静态ArrayList listOfItemsToDelete;
SQLITE数据库;
私有类别[]类别;
ArrayList类别列表;
专用阵列适配器列表适配器;
ImageView iv_删除;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u delete\u数据);
此.setRequestedOrientation(ActivityInfo.SCREEN\u ORIENTATION\u Graphic);
管理重新加载列表();
listOfItemsToDelete=newarraylist();
iv_delete=(ImageView)findViewById(R.id.imageViewDeleteDataDelete);
iv_删除。可点击设置(真);
iv_delete.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
if(listOfItemsToDelete.isEmpty()){
Toast.makeText(getBaseContext(),“未选择任何项。”,
吐司。长度(短)。show();
}
否则{
显示对话框(
“警告”,
“确实要删除这些类别吗?这将删除所有附加的记录。”);
}
}
});
lv_delete_data=(ListView)findViewById(R.id.listViewDeleteData);
lv_delete_data.setAdapter(listAdapter);
lv_delete_data.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
公共链接(AdapterView arg0、视图arg1、内部arg2、,
长arg3){
//TODO自动生成的方法存根
ImageView图像视图=(图像视图)arg1
.findViewById(R.id.imageViewSingleRowDeleteData);
Category Category=(Category)imageView.getTag();
if(category.getChecked()==false){
imageView.setImageResource(R.drawable.set_check);
listOfItemsToDelete.add(category.getId());
类别。setChecked(真);
}否则{
imageView.setImageResource(R.drawable.set_基圆);
删除((整数)category.getId());
类别。setChecked(假);
}
}
});
}
私有void showDialog(最终字符串标题、字符串消息){
AlertDialog.Builder adb=新生成器(DeleteData.this);
adb.setTitle(标题);
adb.setMessage(消息);
adb.setIcon(R.drawable.ic_启动器);
字符串btn=“确定”;
如果(标题等于(“警告”)){
btn=“是”;
adb.setNegativeButton(“否”,新的DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
dialog.dismise();
}
});
}
adb.setPositiveButton(btn,新的DialogInterface.OnClickListener(){
公共void onClick(对话框接口arg0,int arg1){
如果(标题等于(“警告”)){
for(int i:listOfItemsToDelete){
//------首先从类别表中删除-----
删除(“类别字段”,“类别id=?”,
新字符串[]{i+“”});
//-----现在获取目录id,其中包含目录id=
//我-----------------
cursor=database.query(“记录\数据”,
新字符串[]{“rec_id”},“cat_id=?”,
N
public class DeleteData extends Activity {

Cursor cursor;
ListView lv_delete_data;
static ArrayList<Integer> listOfItemsToDelete;
SQLiteDatabase database;
private Category[] categories;
ArrayList<Category> categoryList;
private ArrayAdapter<Category> listAdapter;
ImageView iv_delete;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_delete_data);

    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    manage_reload_list();

    listOfItemsToDelete = new ArrayList<Integer>();

    iv_delete = (ImageView) findViewById(R.id.imageViewDeleteDataDelete);
    iv_delete.setClickable(true);
    iv_delete.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            if (listOfItemsToDelete.isEmpty()) {

                Toast.makeText(getBaseContext(), "No items selected.",
                        Toast.LENGTH_SHORT).show();
            }

            else {
                showDialog(
                        "Warning",
                        "Are you sure you want to delete these categories ? This will erase all records attached with it.");
            }
        }
    });

    lv_delete_data = (ListView) findViewById(R.id.listViewDeleteData);
    lv_delete_data.setAdapter(listAdapter);
    lv_delete_data.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub
            ImageView imageView = (ImageView) arg1
                    .findViewById(R.id.imageViewSingleRowDeleteData);
            Category category = (Category) imageView.getTag();

            if (category.getChecked() == false) {
                imageView.setImageResource(R.drawable.set_check);
                listOfItemsToDelete.add(category.getId());
                category.setChecked(true);
            } else {
                imageView.setImageResource(R.drawable.set_basecircle);
                listOfItemsToDelete.remove((Integer) category.getId());
                category.setChecked(false);
            }
        }
    });
}

private void showDialog(final String title, String message) {

    AlertDialog.Builder adb = new Builder(DeleteData.this);
    adb.setTitle(title);
    adb.setMessage(message);
    adb.setIcon(R.drawable.ic_launcher);
    String btn = "Ok";
    if (title.equals("Warning")) {
        btn = "Yes";
        adb.setNegativeButton("No", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
    }

    adb.setPositiveButton(btn, new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface arg0, int arg1) {

            if (title.equals("Warning")) {

                for (int i : listOfItemsToDelete) {

                    // -------first delete from category table-----

                    database.delete("category_fields", "cat_id=?",
                            new String[] { i + "" });

                    // --------now fetch rec_id where cat_id =
                    // i-----------------

                    cursor = database.query("records_data",
                            new String[] { "rec_id" }, "cat_id=?",
                            new String[] { i + "" }, null, null, null);
                    if (cursor.getCount() == 0)
                        cursor.close();
                    else {
                        ArrayList<Integer> al_tmp_rec_id = new ArrayList<Integer>();
                        while (cursor.moveToNext())
                            al_tmp_rec_id.add(cursor.getInt(0));
                        cursor.close();

                        for (int i1 : al_tmp_rec_id) {
                            database.delete("records_fields_data",
                                    "rec_id=?", new String[] { i1 + "" });

                            database.delete("record_tag_relation",
                                    "rec_id=?", new String[] { i1 + "" });
                        }

                        // ---------delete from records_data-------

                        database.delete("records_data", "cat_id=?",
                                new String[] { i + "" });

                        cursor.close();
                    }
                }

                showDialog("Success",
                        "Categories, with their records, deleted successfully.");
            } else {
                database.close();
                listOfItemsToDelete.clear();
                manage_reload_list();
                lv_delete_data.setAdapter(listAdapter);
            }
        }
    });

    AlertDialog ad = adb.create();
    ad.show();
}

protected void manage_reload_list() {

    loadDatabase();

    categoryList = new ArrayList<Category>();

    // ------first fetch all categories name list-------

    cursor = database.query("category", new String[] { "cat_id",
            "cat_description" }, null, null, null, null, null);
    if (cursor.getCount() == 0) {
        Toast.makeText(getBaseContext(), "No categories found.",
                Toast.LENGTH_SHORT).show();
        cursor.close();
    } else {

        while (cursor.moveToNext()) {

            categories = new Category[] { new Category(cursor.getInt(0),
                    cursor.getString(1)) };
            categoryList.addAll(Arrays.asList(categories));
        }
        cursor.close();
    }
    listAdapter = new CategoryArrayAdapter(this, categoryList);
}

static class Category {

    String cat_name = "";
    int cat_id = 0;
    Boolean checked = false;

    Category(int cat_id, String name) {
        this.cat_name = name;
        this.cat_id = cat_id;
    }

    public int getId() {
        return cat_id;
    }

    public String getCatName() {
        return cat_name;
    }

    public Boolean getChecked() {
        return checked;
    }

    public void setChecked(Boolean checked) {
        this.checked = checked;
    }

    public boolean isChecked() {
        return checked;
    }

    public void toggleChecked() {
        checked = !checked;
    }
}

static class CategoryViewHolder {

    ImageView imageViewCheck;
    TextView textViewCategoryName;

    public CategoryViewHolder(ImageView iv_check, TextView tv_category_name) {
        imageViewCheck = iv_check;
        textViewCategoryName = tv_category_name;
    }

    public ImageView getImageViewCheck() {
        return imageViewCheck;
    }

    public TextView getTextViewCategoryName() {
        return textViewCategoryName;
    }
}

static class CategoryArrayAdapter extends ArrayAdapter<Category> {

    LayoutInflater inflater;

    public CategoryArrayAdapter(Context context, List<Category> categoryList) {

        super(context, R.layout.single_row_delete_data,
                R.id.textViewSingleRowDeleteData, categoryList);
        inflater = LayoutInflater.from(context);
    }

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

        Category category = (Category) this.getItem(position);

        final ImageView imageViewCheck;
        final TextView textViewCN;

        if (convertView == null) {

            convertView = inflater.inflate(R.layout.single_row_delete_data,
                    null);

            imageViewCheck = (ImageView) convertView
                    .findViewById(R.id.imageViewSingleRowDeleteData);
            textViewCN = (TextView) convertView
                    .findViewById(R.id.textViewSingleRowDeleteData);

            convertView.setTag(new CategoryViewHolder(imageViewCheck,
                    textViewCN));
        }

        else {

            CategoryViewHolder viewHolder = (CategoryViewHolder) convertView
                    .getTag();
            imageViewCheck = viewHolder.getImageViewCheck();
            textViewCN = viewHolder.getTextViewCategoryName();
        }

        imageViewCheck.setFocusable(false);
        imageViewCheck.setFocusableInTouchMode(false);
        imageViewCheck.setClickable(true);
        imageViewCheck.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                ImageView iv = (ImageView) v;
                Category category = (Category) iv.getTag();

                if (category.getChecked() == false) {
                    imageViewCheck.setImageResource(R.drawable.set_check);
                    listOfItemsToDelete.add(category.getId());
                    category.setChecked(true);
                } else {
                    imageViewCheck
                            .setImageResource(R.drawable.set_basecircle);
                    listOfItemsToDelete.remove((Integer) category.getId());
                    category.setChecked(false);
                }
            }
        });
        imageViewCheck.setTag(category);

        if (category.getChecked() == true)
            imageViewCheck.setImageResource(R.drawable.set_check);
        else
            imageViewCheck.setImageResource(R.drawable.set_basecircle);

        textViewCN.setText(category.getCatName());

        return convertView;
    }
}

private void loadDatabase() {
    database = openOrCreateDatabase("WalletAppDatabase.db",
            SQLiteDatabase.OPEN_READWRITE, null);
}
}