0

Custom によってバインドされたリストにチェックボックスのリストがありますsimpleCursorAdapter。私のカスタムsimpleCursorAdapterでは、変更を加えてオーバーライドnewViewしましbindViewた。私は何とかマルチチョイスを行うことができました。奇妙なことに、リストからアイテムを削除した後、最初のアイテムのチェックボックスが突然チェックされます。それはどのように起こりますか?どうすれば解決できますか?

SimpleCursorAdapterのクラス:

public class MyListCursorAdapter extends SimpleCursorAdapter
{
    private Context context;
    private int layout;

    public MyCursorAdapter(Context context, int layout, Cursor c,
            String[] from, int[] to)
    {
        super(context, layout, c, from, to);
        this.context = context;
        this.layout = layout;
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent)
    {
        Cursor c = getCursor();
        final LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(layout, parent, false);
        CheckBox chkBoxBtn = (CheckBox) v.findViewById (R.id.deleteTwittChkBox);
        if (chkBoxBtn != null)
        {
            chkBoxBtn.setChecked(false);
        }
        return v;
    }

    @Override
    public void bindView(View v, Context context, Cursor c)
    {
        --binding view to my textsview in my items
        //now it's the importat part:
            CheckBox chkBoxBtn = (CheckBox) v.findViewById(R.id.deleteTwittChkBox);
    if (chkBoxBtn != null)
    {
        chkBoxBtn.setId(Integer.valueOf(c.getString(c
                .getColumnIndex(MyUsers.User._ID))));
        chkBoxBtn.setOnClickListener(new OnItemClickListener(chkBoxBtn, v));
        chkBoxBtn.setChecked(false);
    }
    }

    //i couldnt find another way of doing this, but this is how i set listeners to my checkboxses
    static ArrayList<String> checkedItemsList = new ArrayList<String>();

    private class OnItemClickListener implements OnClickListener
    {
        private int mPosition;
        private CheckBox chkBox;
        OnItemClickListener(CheckBox mChkBox, View v)
        {
            chkBox = mChkBox;
            chkBox.setChecked(false);
        }

        @Override
        public void onClick(View v)
        {
            if (chkBox.isChecked())
            {
                checkedItemsList.add(String.valueOf(chkBox.getId()));
            }
            else
            {
                checkedItemsList.remove(String.valueOf(chkBox.getId()));
            }
        }
    }
}

ListActivityチェックボックス項目を削除するボタンを記述するクラスのコード部分を次に示します。

OnClickListener btListener = new OnClickListener()
{
    public void onClick(View view)
    {
        // long[] items = listView.getCheckItemIds();
        int x = 0;
        Uri myUri = Uri
        .parse("content://com.idan.datastorageprovider/users");
        String where = "_id" + "=?";
        //here i am tatking all checkboxes which ive added from the  adapter class
        ArrayList<String> checkedItemsList =   MySimpleCursorAdapter.checkedItemsList;
        for (String itemID : checkedItemsList)
        {
            getContentResolver()
            .delete(myUri, where, new String[] { itemID});
            checkedItemsList.remove(itemID);
        }
    }
};
4

3 に答える 3

2

SimpleCursorAdapter がここで拡張する適切なクラスであるとは思えません。

「チェック済み」状態は何らかの方法でデータ XML に接続されていますか? いいえ?そのため、独自のカスタム アダプターが必要です。

基本的に、すべてのアダプターは、特定の要素 (より正確には要素の位置) からビューを生成する方法を実装する必要があります。これは、リストが要素を表示したいときにいつでも呼び出されます。ここで使用するトリックは、画面に表示されなくなった、以前に作成されたリスト ビュー要素を再利用することです。したがって、リストを下にスクロールして要素が上部に消えると、正確にこのビュー オブジェクトが次に表示されるアイテムに再利用されます。

したがって、再利用する必要がある特定の「古い」ビューでこのメソッドを呼び出す場合、含まれるすべての要素を要素データに従って設定する必要があります。チェックボックスがこのゲームの一部である場合、チェックされた状態のストレージが必要になります! リスト要素があるため、チェックボックス オブジェクトが少なくなるため、チェックボックスを持つだけでは十分ではありません。

SimpleCursorAdapters は - ええ - シンプルなものを表すためにあります。XML 記述データ (ドキュメントに記載されている画像とテキスト)。この単純さのために、ここでしなければならないことは、新しい要素ビュー オブジェクトを作成するメソッドを提供することだけです。再利用プロセスをまったく傍受しているわけではありません。基本的に、既存のビュー オブジェクトにデータを配置する方法しか認識していませんが、チェックされている/チェックされていないボックスを処理する方法についての知識が不足しています。

あなたの解決策: 独自の BaseAdapter 拡張機能を作成し、「getView」(および getItem、getItemId、getCount などの他のメソッド) を実装する必要があることを行います。それはまったく難しいことではありません!このAPI デモは BaseAdapter を使用しており、mExpandedここでの状態は基本的にチェックボックスの状態と同じです!

幸運を!

于 2010-02-16T11:51:51.517 に答える
0

データを変更するときに、notifyDataSetChangedを呼び出す必要がある場合があります。

于 2010-02-16T01:58:08.137 に答える
0

問題はおそらく、onItemClickListener 内から setChecked を呼び出していることです。これを回避する 1 つのハックな方法は、リスナー内から setChecked を呼び出す前後に次のことを行うことです。

chkBox.setClickable(false);
chkBox.setChecked(false);
checkBox.setClickable(true);

これにより、手動で setChecked を呼び出したときに onItemClickListener が呼び出されなくなります。

于 2010-02-16T05:19:26.047 に答える