设置所选项而不触发OnItemSelectedListener

时间:2018-02-11 16:53:05

标签: android

我几天来一直在努力解决这个问题,我有一个从服务器加载的项目列表。加载项目时,我显示列表,然后为每个微调器设置所选项目。现在这些是我的问题。

案例1: 我的适配器中每个项目的onItemSelectedListener在页面加载时被触发。

所以我在网上进行了一些研究并决定使用变量来检查状态。创建视图时,我在on click侦听器中将firstTime设置为true,如下所示:

viewHolder.spStatus.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

        if (!firstTime) {
            AlertDialog.Builder builder = new AlertDialog.Builder(context);

            builder.setTitle("Confirm");
            builder.setMessage("Are you sure you want to change this?");

            builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int which) {
                    int selectedPosition = Integer.parseInt(viewHolder.id.getTag().toString());
                    String selectedId = viewHolder.id.getText().toString();
                    updateStatus(selectedPosition, selectedId,
                            ((ArrayAdapter<String>) viewHolder.spStatus.getAdapter())
                                    .getItem(selectedPosition));
                }

            });

            builder.setNegativeButton("NO", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // Do nothing
                    dialog.dismiss();
                }
            });

            AlertDialog alert = builder.create();
            alert.show();
        }

        firstTime = false;
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        // Do Nothing
    }
});

现在这就是我执行此操作时发生的事情,当我滚动onItemSelected更改侦听器时,根据我放置firstTime=false的位置触发,或者当我过滤列表时,我必须在触发事件之前点击两次。< / p>

3 个答案:

答案 0 :(得分:0)

如果我理解正确,您的ViewHolder itemView包含Spinner。您希望能够以编程方式设置Spinner的选定位置,而不会触发OnItemSelectedListener的{​​{1}}。

目前您正在使用匿名Spinner。如果您将此侦听器设为OnItemSelectedListener

的字段
ViewHolder

...然后你可以在以编程方式设置所选位置之前“取消设置”监听器,然后像下面的方法那样“重置”它:

private OnItemSelectedListener listener = new AdapterView.OnItemSelectedListener(){
    // listener code goes here
    // ...
    };

答案 1 :(得分:0)

Kotlin中RecyclerView Adapter的解决方案

@bot.command()
async def embed(ctx, *, data):
    data = data.split('-')  # title = 0, desc = 1, footer=2
    embed = discord.Embed(
        title=f"{data[0]}", description=f"{data[1]}", color=0x00ff00)
    embed.set_footer(text=f"{data[2]}")
    await ctx.send(embed=embed)

答案 2 :(得分:0)

你可以这样做,

    public void setSelection(int position, boolean animate, boolean noTrigger, OnItemSelectedListener onItemSelectedListener) {
    if(noTrigger) {
        Log.e("SET_SELECTION", "No trigger at position " + position);
        this.setOnItemSelectedListener(null);
    }

    super.setSelection(position, animate);
    this.post(new Runnable() {
        @Override
        public void run() {
            setOnItemSelectedListener(onItemSelectedListener);
        }
    });
}