【问题标题】:List view implementation with text view and toggle button i=带有文本视图和切换按钮 i= 的列表视图实现
【发布时间】:2023-04-07 16:10:01
【问题描述】:

在我的应用程序中,我想创建带有切换按钮和文本视图的列表视图。当我单击列表项时,我想进行下一个活动。但是当我点击 Toogle 按钮时,我需要显示它处于关闭模式或开启模式。下面我添加我的代码。

$ 这是我的主要活动

public class MainActivity extends Activity {

    int startminute;
    int endminute;

    Date date;
    ToggleButton togg;
    ListView lv;
    String[] days = { "SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY",
            "FRIDAY", "SATURDAY" };
    boolean[] onOff = new boolean[] { false, false, false, false, false, false,
            false };

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.listview);
        if (savedInstanceState != null) {
            onOff = savedInstanceState.getBooleanArray("status");
        }
        lv = (ListView) findViewById(R.id.listView1);
        lv.setAdapter(new MyAdapter());
        lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        lv.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> arg0, View arg1,
                    int position, long arg3) {

                Intent in = new Intent(MainActivity.this, StartAndEndTime.class);
                in.putExtra("position", position);
                startActivity(in);
            }
        });
    }

    public class MyAdapter extends BaseAdapter {

        public int getCount() {
            return days.length;
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        @Override
        public int getItemViewType(int position) {

            return position;
        }

        @Override
        public int getViewTypeCount() {
            return days.length;
        }

        public View getView(final int position, View convertView,
                ViewGroup parent) {
            View v = null;
            TextView arryText;

            if (v == null) {
                LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.inflate, null);

                arryText = (TextView) v.findViewById(R.id.inflateText);
                togg = (ToggleButton) v.findViewById(R.id.toggleButton1);
                v.setTag(new ViewHolder(arryText, togg));

                togg.setOnClickListener(new OnClickListener() {

                    public void onClick(View v) {

                        if (togg.isChecked()) {
                            togg.setChecked(false);
                            onOff[position] = false;

                            Toast.makeText(MainActivity.this, "is off",
                                    Toast.LENGTH_SHORT).show();

                        } else {

                            onOff[position] = true;
                            togg.setChecked(true);
                            Toast.makeText(MainActivity.this, "is on",
                                    Toast.LENGTH_SHORT).show();
                        }
                    }
                });

                arryText.setText(days[position]);
                togg.setChecked(onOff[position]);
            }

            return v;
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBooleanArray("status", onOff);
}

【问题讨论】:

  • 使用 setOnCheckedChangeListener 代替 setOnClickListener,它会解决你的问题。

标签: android list android-layout android-listview listitem


【解决方案1】:

以这种方式更改您的getView 方法...

public View getView(final int position, View convertView,
        ViewGroup parent) {
    View v = null;
    TextView arryText;

    if (v == null) {
        LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.inflate, null);
    }
        arryText = (TextView) v.findViewById(R.id.inflateText);
        togg = (ToggleButton) v.findViewById(R.id.toggleButton1);
        v.setTag(new ViewHolder(arryText, togg));

        togg.setOnClickListener(new OnClickListener() {

                public void onClick(View v) {

                    if (onOff[position]) {
                        togg.setChecked(false);
                        onOff[position] = false;

                        Toast.makeText(MainActivity.this, "is off",
                                Toast.LENGTH_SHORT).show();

                    } else {

                        onOff[position] = true;
                        togg.setChecked(true);
                        Toast.makeText(MainActivity.this, "is on",
                                Toast.LENGTH_SHORT).show();

                    }

                }
            });

        arryText.setText(days[position]);
        togg.setChecked(onOff[position]);



    return v;
}

【讨论】:

  • +1 你在我之前就这个问题发布的好答案..恭喜
  • 感谢您的回复。当我在切换按钮上时,我尝试使用你的解决方案,我得到响应“开启”,这很好。但是当我再次点击关闭切换按钮时,它显示“开启”。调试后我认为数组“onOff”不是更新。每次编译器进入
  • else { onOff[position] = true; togg.setChecked(true); Toast.makeText(MainActivity.this, "开启", Toast.LENGTH_SHORT).show(); }
  • 如果 v = null 在第一行,那么 v == null 总是,所以这个解决方案忽略了回收过程......但它有效
【解决方案2】:

这样做:

在构造函数中:将 Activity 的上下文传递给 Adapter 类,并为 LayoutInflater 使用相同的上下文:

mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

在 getView() 中:

View v = null;

if (convertView == null) {
    v = mInflater.inflate(R.layout.demo_list, parent, false);
} else {
    v = convertView;
}

你现在得到了视图(v),添加视图/监听器然后返回!

返回 v;

【讨论】:

    【解决方案3】:

    问题可能与位置有关。试试这个代码:

    public View getView(final int position, View convertView,
                ViewGroup parent) {
            View v = null;
            TextView arryText;
            final int rowPosition = position;
    
            if (v == null) {
                LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.inflate, null);
    
                arryText = (TextView) v.findViewById(R.id.inflateText);
                togg = (ToggleButton) v.findViewById(R.id.toggleButton1);
                v.setTag(new ViewHolder(arryText, togg));
    
    
                togg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // Save the state here
                onOff[rowPosition]= isChecked;
                  Toast.makeText(MainActivity.this, isChecked ? "is on" : "is off",
                                    Toast.LENGTH_SHORT).show();
                }
                });
    
    
                arryText.setText(days[rowPosition]);
                togg.setChecked(onOff[rowPosition]);
    
            }
    
            return v;
        }
    

    【讨论】:

    • 感谢您的回复。我将通过此代码。但如果我使用 setOnCheckedChangeListener() 则无法点击
    • 好的,如果您愿意,请尝试使用 onClick。重要的是最终 int rowPosition = position;从我的角度来看。
    • 感谢它在我使用点击监听器后工作......非常感谢
    • 顺便说一句,你应该使用我写的 onCheckChanged 监听器,但也要添加空的 onClick 监听器。
    猜你喜欢
    • 2012-10-16
    • 1970-01-01
    • 2017-07-24
    • 2023-03-26
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多