5

ListViewアイテムをクリックすると新しい が発生するカスタムがありますActivity。の各行にはListViewと がCheckBoxありTextViewます。

これはgetView私のカスタムの方法ですListView:

public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.puzzles_row, null);
        }
        ListedPuzzle lp = items.get(position);
        if (lp != null) {
            TextView title = (TextView) v.findViewById(R.id.listTitles);
            title.setText(lp.getTitle());
            CheckBox star = (CheckBox) v.findViewById(R.id.star_listed);
            star.setChecked(lp.isStarred());
            star.setTag(new Integer(position));

            star.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                public void onCheckedChanged(CompoundButton buttonView,
                        boolean isChecked) {
                    Integer realPosition = (Integer) buttonView.getTag();
                    ListedPuzzle obj = items.get(realPosition);
                    starListedPuzzle(obj.getId(), isChecked);
                }
            });

        }
        return v;

    }

onCheckedChanged、実際に何かをチェックするためのユーザー操作なしで、別のアクティビティから戻ってきたときに呼び出されます。

ポイントは、以前は正常に機能していて、実際には何も変わっていないということです。バグだと読んだことがありますが、本当に信じられません。

の同じ 2 つの項目で常にメソッドを呼び出しますListView。どういうわけか設定できcheckedChange=trueますか?

4

4 に答える 4

10

私はそれが方法で起こっていると感じていonRestoreInstanceStateます。ViewAndroidは、アクティビティが一時停止および再開されたときに、アクティビティ内のほとんどの の状態の復元を自動的に処理します。CheckBox再開すると、オブジェクトのチェック状態を復元しているように聞こえますonCheckedChanged。でこれを試して、これでActivity問題が解決するかどうかをお知らせください。

private boolean mRestoringInstanceState;

@Override
protected void onRestoreInstanceState( Bundle savedInstanceState ) {

    mRestoringInstanceState = true;
    super.onRestoreInstanceState( savedInstanceState );
    mRestoringInstanceState = false;
}

次に、onCheckChangedメソッドを次のように変更します。

public void onCheckedChanged(CompoundButton buttonView,
        boolean isChecked) {

    if(!mRestoringInstanceState) {
        Integer realPosition = (Integer) buttonView.getTag();
        ListedPuzzle obj = items.get(realPosition);
        starListedPuzzle(obj.getId(), isChecked);
    }
}

編集:onResumeおそらくより良い/より簡単な解決策は、メソッドの後に呼び出されるため、代わりにリスナーをメソッドに割り当てることonRestoreInstanceStateです。このソリューションを使用する場合、上記のいずれも実装しないことに注意してください。

@Override
protected void onResume() {

    super.onResume();
    CheckBox star = (CheckBox) v.findViewById(R.id.star_listed);
    star.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
            // onCheckedChanged implementation
        }
    });
}

Edit2:でこれを行っていることに気付きましたAdapter。これは とは関係ないかもしれませんがonRestoreInstanceState、問題があると思います。Viewで s を再利用してAdapterいますが、これは良いことですがstar、リスナーを設定する前にチェック済みに設定しています。問題は、最後にメソッドstarを通過したときのリスナーがすでにあることです。getViewに電話する前にstar.setChecked()、電話star.setOnCheckedChangedListener(null)して問題が解決するかどうかを確認してください。

于 2012-05-18T18:49:09.177 に答える
9

フラグメント内の onRestoreInstanceState で呼び出すことができます

あなたはそれを無効にすることができます

android:saveEnabled="false"

チェックボックスのレイアウト定義

于 2015-06-10T18:44:26.990 に答える
6

カスタムアダプターを使用して、この問題にも遭遇しました。

ボタン isShown が問題を解決するかどうかを確認しました。

OnCheckedChangeListener ccl = new OnCheckedChangeListener()
{
    @Override
    public void onCheckedChanged(CompoundButton buttonView,
            boolean isChecked) {

        if(buttonView.isShown())
        {

        }
    }
};
于 2014-03-20T16:28:13.103 に答える