【问题标题】:Android - ToggleButton losses it's state after scrolling ListViewAndroid - 滚动 ListView 后,ToggleButton 失去其状态
【发布时间】:2015-02-26 03:56:56
【问题描述】:

我两天以来一直在尝试解决这个问题。我已经看到很多与此问题相关的问题。但它们对我不起作用。
我有一个自定义ListView。每一行包括一个ImageView、两个TextViews 和一个ToggleButton。这些都很好。当我将ToggleButton 的状态更改为true 时,当我向下滚动并再次向上滚动时,ToggleButton 失去了它的状态。这又是false

这是我的ArrayAdapter

private class MyAdapter extends ArrayAdapter<String> {

    public MyAdapter(Context context, int resource, int textViewResourceId,
            String[] strings) {
        super(context, resource, textViewResourceId, strings);
        // TODO Auto-generated constructor stub
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        LayoutInflater inflater  = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row = inflater.inflate(R.layout.friends_list_item_layout, parent, false);

        RoundedImageView friendThumb = (RoundedImageView) row.findViewById(R.id.friendDp);
        TextView friendName = (TextView) row.findViewById(R.id.friendName);
        TextView friendNumber = (TextView) row.findViewById(R.id.friendNumber);
        ToggleButton shareToggle = (ToggleButton) row.findViewById(R.id.shareLocatioToggle);

        friendName.setText(myItems[position]);
        friendNumber.setText("8888888888");
        //friendThumb.setImageResource(R.drawable.friend_dp_thumb);

        shareToggle.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
                // TODO Auto-generated method stub
                if (arg1) {
                    Toast.makeText(getApplicationContext(), "Shared with "+myItems[position], Toast.LENGTH_SHORT).show();
                }
            }
        });

        shareToggle.setOnLongClickListener(new OnLongClickListener() {

            @Override
            public boolean onLongClick(View arg0) {
                // TODO Auto-generated method stub
                Toast.makeText(getApplicationContext(), "Share your location", Toast.LENGTH_SHORT).show();
                return false;
            }
        });

        return row;
    }



}

谢谢

【问题讨论】:

  • 您必须根据当前项目在getView() 上显式设置切换状态,与为TextView 设置文本的方式相同
  • 但是如何在代码中做到这一点?我很困惑
  • Issue with ViewHolder selection 的可能重复项

标签: java android android-listview android-arrayadapter android-togglebutton


【解决方案1】:

您需要两件事,一个用来记住哪些项目已被切换的数组,以及明确setChecked() 已被切换的项目。

private boolean[] myChecks = new boolean[myItems.length];
private class MyAdapter extends ArrayAdapter<String> {
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ...
        shareToggle.setChecked(myChecks[position]);
        shareToggle.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
                ...
                myChecks[position] = arg1;
            }
        });
}

【讨论】:

  • 完美解决方案。非常感谢:)
【解决方案2】:

您必须使用 setter getter 方法维护切换标志,默认情况下它被设置为关闭,然后您必须打开/关闭切换并调用 notifydatasetchanged() 以维护其状态。

【讨论】:

【解决方案3】:

如果视图超出列表视图的可见性,则重新创建切换状态。可以使整个活动可滚动。所以切换按钮不会丢失其状态

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 2013-12-04
    • 2021-06-20
    • 2016-02-09
    • 1970-01-01
    相关资源
    最近更新 更多