无法将参数传递给OnClickListener?

时间:2017-01-31 05:09:14

标签: android

我有我的活动适配器来处理我的主要项目列表。当我点击删除时,我想提示用户,如果确认从列表中删除该项并刷新视图。

我有删除项目的逻辑,但似乎并不是将参数传递给OnClickListener的方法。如果单击列表上的按钮,如何捕获单击的位置以及如何将其传递给OnClickListener函数以便删除正确的元素?

任何帮助将不胜感激,

谢谢你, 拉狄克

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

    try {
        if(convertView == null){
            convertView = layoutInflater.inflate(com.mylist.www.R.layout.activity_main_row,parent,false);
        }

        TextView textView = (TextView) convertView.findViewById(com.mylist.www.R.id.rowText);
        textView.setText(listItems.getJSONObject(_position).getString("description"));

        // set the checkbox stuff
        CheckBox chkEnabled = (CheckBox) convertView.findViewById(com.mylist.www.R.id.chkEnabled);

        textView.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                try{
                    if (listItems != null){
                        JSONArray clickedItems = listItems.getJSONObject(_position).getJSONArray("listItems"); // position
                        Intent intent = new Intent(context, ListActivity.class);

                        intent.putExtra("listItems", clickedItems.toString());
                        context.startActivity(intent);
                    }
                } catch (Exception e){
                    e.printStackTrace();
                }

            }

        });

        Button btnNavigate = (Button) convertView.findViewById(com.mylist.www.R.id.btnDelete);
        btnNavigate.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                try{
                    if (listItems != null){

                        AlertDialog.Builder builder = new AlertDialog.Builder(context);
                        builder.setMessage("Are you sure?").setPositiveButton("Yes", dialogClickListener)
                                .setNegativeButton("No", dialogClickListener).show();
                    }
                } catch (Exception e){
                    e.printStackTrace();
                }

            }

        });


        return convertView;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {

        try {
            switch (which){
                case DialogInterface.BUTTON_POSITIVE:
                    //Yes button clicked
                    listItems.remove(position); //????? how do I pass it

                    JSONObject jObj = new JSONObject();
                    jObj.put("Items", listItems);

                    editor.putString("json",jObj.toString());
                    editor.commit();

                    ((MainActivity)context).refreshView();

                    break;

                case DialogInterface.BUTTON_NEGATIVE:
                    //No button clicked
                    break;
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
};

5 个答案:

答案 0 :(得分:1)

嘿,你有一个mistek吗?

Country:    US
Phone Code: #VALUE!

替换

listitem.remove(postion)

答案 1 :(得分:1)

为什么不将位置存储在另一个变量中,以后再使用它

int currentPosition;

当用户点击按钮时,在getView()中存储当前视图位置

currentPosition = position;

AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage("Are you sure?").setPositiveButton("Yes", dialogClickListener)
                            .setNegativeButton("No", dialogClickListener).show();

然后在你的监听器中使用它

listItems.remove(currentPosition);

答案 2 :(得分:1)

在类

中将currentItemPosition变量声明为全局变量
int currentItemPosition;
当用户点击按钮时

存储位置

currentItemPosition = _position;

并在你的听众中使用它

listItems.remove(currentItemPosition);

答案 3 :(得分:1)

您可以在充气时为每行设置标记:

view.setTag(position)

然后点击按钮,您可以将该行的位置设为

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //current row view clicked position
                int currentItemPosition = (Integer) button.getTag();

                 //now remove the item from the list at the clicked position
                 listItems.remove(currentItemPosition);

            }
        });

通过这种方式,您可以获得用户从列表视图中单击的项目的位置,然后执行进一步的操作。希望这可以帮助你

答案 4 :(得分:1)

通过这种实施,我们无法获得这个位置。如果您想获得职位,请修改您的代码,如下所示 -

  AlertDialog.Builder builder = new AlertDialog.Builder(context);
                            builder.setMessage("Are you sure?").setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    // you can get position here
                                }
                            }).setNegativeButton("No", dialogClickListener).show();