【问题标题】:Only 1 button enable in ListView, custom adapterListView 中仅启用 1 个按钮,自定义适配器
【发布时间】:2015-09-04 14:30:04
【问题描述】:

我遇到了一个问题,我需要在 ListView 中启用我的按钮。奇怪的是:

 public class CookingStepAdapter extends ArrayAdapter<CookingStep> {

...
       private void addButtonToList(Button clock, Button skip){
            if (list_clock_button == null) {
                list_clock_button = new ArrayList<Button>();
                iterate = 0;
            }
            if (list_skip_button == null)
                list_skip_button = new ArrayList<Button>();
            list_clock_button.add(clock);
            list_skip_button.add(skip);

            clock.setEnabled(true);
            skip.setEnabled(true);

            list_clock_button.get(0).setEnabled(true);
            list_clock_button.get(0).setFocusable(true);
            list_clock_button.get(0).setFocusableInTouchMode(true);
            list_clock_button.get(0).invalidate();

            list_skip_button.get(0).setEnabled(true);
            list_skip_button.get(0).setFocusable(true);
            list_skip_button.get(0).setFocusableInTouchMode(true);
            list_skip_button.get(0).postInvalidate();
        }
}

当我使用list_clock_button.get(0) 设置启用时,它根本不起作用。但clock.setEnabled(true); 确实有效。

但是我只希望启用 ListView 的第一个按钮,这使得第一个选项更适合这种情况。第二个选项有效,但它启用了所有按钮,这不是我想要的。我确实重新检查了第一个按钮地址,它与list_clock_button.get(0) 匹配,为什么它不起作用。

编辑:

这是我的函数 getView :

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.cooking_steps_and_timer, parent, false);

        final Button button = (Button) rowView.findViewById(R.id.button_timer);
        final TextView timer = (TextView) rowView.findViewById(R.id.cooking_timer);
        final Button skipButton = (Button) rowView.findViewById(R.id.button_skip);
        TextView stepContent = (TextView) rowView.findViewById(R.id.cooking_step_content);

        final CookingStep step = list.get(position);
        String stepOrder = (String) context.getResources().getText(R.string.step_order) + " " + step.getOrder();
        String content = "<b>" + stepOrder + ":</b>" + " " + step.getContent() + "\n";
        stepContent.setText(Html.fromHtml(content));

        if (step.getTimer() == null || step.getTimer() == 0){
            timer.setVisibility(View.GONE);
            button.setVisibility(View.GONE);
            skipButton.setVisibility(View.GONE);
        } else {

            //myTimer = new CookingTimer(step.getTimer());
            timer.setText(step.getMyTimer().toString());
            step.setCountDown(new CountDownTimer(step.getTimer() * 60000, 1000) {
                @Override
                public void onTick(long millisUntilFinished) {
                    step.getMyTimer().tick();
                    timer.setText(step.getMyTimer().toString());
                }

                @Override
                public void onFinish() {
                    nextButtonEnable();
                }
            });

            button.setText(R.string.button_available);
            skipButton.setText(R.string.skip_button_content);

            addButtonToList(button, skipButton);
            //button.setEnabled(true);

            list_clock_button.get(0).setEnabled(true);

            button.requestFocusFromTouch();
            button.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if (event.getAction() == MotionEvent.ACTION_UP) {

                        if (!button.isPressed()) {
                            button.setPressed(true);
                            button.setText(R.string.button_available);
                            step.getCountDown().start();
                        } else {
                            button.setPressed(false);
                            button.setText(R.string.button_pressed);
                            step.getCountDown().cancel();

                        }
                    }
                    return true;
                }
            });

            skipButton.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    if (event.getAction() == MotionEvent.ACTION_UP) {
                        step.getCountDown().cancel();
                        nextButtonEnable();
                    }
                    return true;
                }
            });
        }
        return rowView;
    }

【问题讨论】:

    标签: android-listview custom-adapter


    【解决方案1】:

    启用所有按钮的原因是您自己设置所有按钮启用。要设置任何特定按钮启用,您必须检查 id 或项目位置以设置该特定按钮启用。 比如这样:-

    if(clock.getID == R.id.some_id_in_xml){
        clock.setEnabled(true);
    }
    

    但在此之前,您必须检查项目的位置以在列表中选择所需的项目。

    【讨论】:

    • 但我确实将它们保存到列表中,并且此列表中的引用与按钮的引用匹配。以及final Button button = (Button) rowView.findViewById(R.id.button_timer); 获得的 (Button clock, Button skip) 而且,如果你说的是问题,那么第一个选项也不应该起作用。
    • 能否提供您的适配器的getView()函数代码。
    • 我将 getView 添加到我的问题中
    • 您不必在列表中添加按钮来设置它们启用或禁用。只需在 CookingStep 类中添加两个数据成员,例如 isButtonEnable 和 isSkipButtonEnable 并根据需要设置值,然后根据这些标志设置按钮属性。因为ListView 在滚动时总是刷新它的视图,你必须根据数据的arraylist 重置所有属性。在你的情况下CookingStep.
    • 即使 ListView 重置所有属性也很奇怪,因为我将该列表设为静态。所以你的意思是我不能操纵适配器内的数据?因为我什至不知道我应该在哪里执行此操作,如果不在适配器内部,因为这是我可以设置按钮侦听器的唯一方法。列表有很多项目,在这些项目之间,有按钮和没有按钮的,所以我希望一开始只启用一个按钮,然后当用户按下它时,它将被禁用和下一个按钮将启用。
    猜你喜欢
    • 2017-04-12
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    相关资源
    最近更新 更多