1

各行がcheckBox、TextView、およびButtonで構成されるlistViewがあります。ボタンはGONEに設定されています。ユーザーが textBox を選択すると、ボタンが表示されるようになります。ユーザーはこのボタンをクリックして行を削除します。

私は動作するcheckBoxのリスナーを実装しましたが、うまくいかないのは、適切なdeleteButtonが表示されるようにする方法です。私の現在のコードでは、ランダムなボタンが表示されます。

私は何をすべきか?チュートリアルまたはコード フラグメントへのポイントは非常に役立ちます。

public class DeleteCampaignCustomCursorAdapater extends CursorAdapter {

protected static final String TAG = null;
DatabaseHelper myDbHelper;
protected SQLiteDatabase db;

private final LayoutInflater mInflater;
protected ListView mListView;

TextView merchantNameView;
Button deleteButton;
CheckBox selectForDelete;
//ImageView moveButton;

public DeleteCampaignCustomCursorAdapater(Context context, Cursor c) {
    super(context, c);
    mInflater = LayoutInflater.from(context);
}

@Override
public void bindView(View view, Context context, final Cursor cursor) {

    myDbHelper = new DatabaseHelper(context); //Links to DatabaseHelper class

    merchantNameView = (TextView) view.findViewById(R.id.deleteMerchantNameView);
    deleteButton = (Button) view.findViewById(R.id.deleteButton);
    selectForDelete = (CheckBox) view.findViewById(R.id.deleteCheckBox);
    //moveButton = (ImageView) view.findViewById(R.id.moveButton);

    merchantNameView.setText(cursor.getString(cursor.getColumnIndex("merchantName")));

    final int  rowID = cursor.getInt(cursor.getColumnIndex("_id"));
    //final long rowID = mListView.getSelectedItemId();

    selectForDelete.setOnCheckedChangeListener(new OnCheckedChangeListener()
    {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
        {
            if ( isChecked )
            {
                // perform logic
                deleteButton.setVisibility(0);
            }
            else {
                deleteButton.setVisibility(8);
            }
        }
    });

    //deleteButton.setOnClickListener(new DeleteEntryOnClicklistener(itemID));  
    deleteButton.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v) {

            if(rowID > 0) {
                //Log.d(TAG, "Button Click. rowID = "+rowID);                   

                myDbHelper.deleteRecordWithID(rowID);
                cursor.requery();
                notifyDataSetChanged();
            }                           
        }
    });     
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    return mInflater.inflate(R.layout.delete_campaign_row_layout, null);
}

}

編集

バラクのアドバイスによる私の新しいコード。最初のバージョンは機能しましたが、行が削除されると、ビューが更新されるとその下の行がチェックされます。cursorOutOfBoundsExceptionこれで、getView() でa を取得します。

public class DeleteCampaignCustomCursorAdapater extends CursorAdapter {

protected static final String TAG = null;
DatabaseHelper myDbHelper;
protected SQLiteDatabase db;
private final Activity context;

private LayoutInflater mInflater;
protected ListView mListView;

private static Cursor c;
public static int[] checked;

TextView merchantNameView;
Button deleteButton;
CheckBox selectForDelete;
//ImageView moveButton;

public DeleteCampaignCustomCursorAdapater(Context context, Cursor c) {
    super(context, c);
    this.context = (Activity) context;
    mInflater = LayoutInflater.from(context);
    DeleteCampaignCustomCursorAdapater.c = c;
    initializeChecked();
}

@Override
public void bindView(View view, Context context, final Cursor cursor) {

    /*myDbHelper = new DatabaseHelper(context); //Links to DatabaseHelper class

    merchantNameView = (TextView) view.findViewById(R.id.deleteMerchantNameView);
    deleteButton = (Button) view.findViewById(R.id.deleteButton);
    //selectForDelete = (CheckBox) view.findViewById(R.id.deleteCheckBox);
    //moveButton = (ImageView) view.findViewById(R.id.moveButton);

    merchantNameView.setText(cursor.getString(cursor.getColumnIndex("merchantName")));

    final int  rowID = cursor.getInt(cursor.getColumnIndex("_id"));     
    //final long rowID = mListView.getSelectedItemId();

    if (checked[rowID] == 0) {
        selectForDelete.setChecked(false);
    } else {
        selectForDelete.setChecked(true);
    }


    selectForDelete.setOnCheckedChangeListener(new OnCheckedChangeListener()
    {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
        {
            if ( isChecked )
            {
               // Make deleteButton appear 
               RelativeLayout ll = (RelativeLayout) buttonView.getParent();
               deleteButton = (Button) ll.findViewById(R.id.deleteButton);
               checked[rowID] = 1;
               deleteButton.setVisibility(0);
            }
            else {
                //Hide deleteButton
                RelativeLayout ll = (RelativeLayout) buttonView.getParent();
                deleteButton = (Button) ll.findViewById(R.id.deleteButton);
                checked[rowID] = 1;
                deleteButton.setVisibility(8);
            }
        }
    });

    deleteButton.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v) {

            if(rowID > 0) {
                //Log.d(TAG, "Button Click. rowID = "+rowID);                   

                myDbHelper.deleteRecordWithID(rowID);
                cursor.requery();
                notifyDataSetChanged();
                initializeChecked();  // re-set the checked array
            }                           
        }
    }); */
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    return mInflater.inflate(R.layout.delete_campaign_row_layout, null);
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    myDbHelper = new DatabaseHelper(context); //Links to DatabaseHelper class

    if (convertView == null) {
        mInflater = context.getLayoutInflater();
        convertView = mInflater.inflate(R.layout.delete_campaign_row_layout, null);
    }       

    merchantNameView = (TextView) convertView.findViewById(R.id.deleteMerchantNameView);
    deleteButton = (Button) convertView.findViewById(R.id.deleteButton);
    selectForDelete = (CheckBox) convertView.findViewById(R.id.deleteCheckBox);     

    merchantNameView.setText(c.getString(c.getColumnIndex("merchantName")));

    final int  rowID = c.getInt(c.getColumnIndex("_id"));       
    //final long rowID = mListView.getSelectedItemId();

    if (checked[position] == 0) {
        selectForDelete.setChecked(false);
    } else {
        selectForDelete.setChecked(true);
    }

    selectForDelete.setOnCheckedChangeListener(new OnCheckedChangeListener()
    {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
        {
            if ( isChecked )
            {
               // Make deleteButton appear 
               RelativeLayout ll = (RelativeLayout) buttonView.getParent();
               deleteButton = (Button) ll.findViewById(R.id.deleteButton);
               checked[position] = 1;
               deleteButton.setVisibility(0);
            }
            else {
                //Hide deleteButton
                RelativeLayout ll = (RelativeLayout) buttonView.getParent();
                deleteButton = (Button) ll.findViewById(R.id.deleteButton);
                checked[position] = 1;
                deleteButton.setVisibility(8);
            }
        }
    });

    deleteButton.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v) {

            if(rowID > 0) {
                //Log.d(TAG, "Button Click. rowID = "+rowID);                   

                myDbHelper.deleteRecordWithID(rowID);
                c.requery();
                notifyDataSetChanged();
                initializeChecked();  // re-set the checked array
            }                           
        }
    });

    return convertView;     
}

public static void initializeChecked() {
    checked = new int[c.getCount()];
    int i = 0;
    while (i < c.getCount()) {
        checked[i] = 0;
        i++;
    }
}

}

4

2 に答える 2

1

あなたはこれを行うことができます:

selectForDelete.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
    {
        if ( isChecked )
        {
           // perform logic 
           LinearLayout ll = (LinearLayout) buttonView.getparent();
           Button b = (Button) ll.findViewById(R.id.deleteButton)
           b.setVisibility(0);
        }
        else {
           LinearLayout ll = (LinearLayout) buttonView.getparent();
           Button b = (Button) ll.findViewById(R.id.deleteButton)
           b.setVisibility(8);
        }
    }
});

ボックスをチェックしたので、行がわかります。チェックボックスの親 (行の LinearLayout である必要があります) を取得し、その行のボタン ID を取得し、それを使用してその特定の削除ボタンの可視性を設定します。行/ビュー。

お役に立てれば。

編集

削除に関する問題を修正するには、次のようなことを行う必要があります。

カスタム アダプタで配列を設定します。

private Cursor c;
public static int[] checked;

コンストラクターで、カーソルをローカル変数に設定し、メソッドを呼び出します。

CursorAdapter_EditText.c = c;
initializeChecked();

メソッド:

public static void initializeChecked() {
    checked = new int[c.getCount()];
    int i = 0;
    while (i < c.getCount()) {
        checked[i] = 0;
        i++;
    }
}

bindview で、次の行を再配置して追加します。

final int  rowID = cursor.getInt(cursor.getColumnIndex("_id"));
selectForDelete = (CheckBox) view.findViewById(R.id.deleteCheckBox);
if (checked(rowID) == 0) {
    selectForDelete.setChecked(false);
} else {
    selectForDelete.setChecked(true);
}

次に、元の回答 onCheckedChanged を次のように変更します::

selectForDelete.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
    {
        if ( isChecked )
        {
           // perform logic 
           LinearLayout ll = (LinearLayout) buttonView.getparent();
           Button b = (Button) ll.findViewById(R.id.deleteButton);
           checked[posSelected] = 1;
           b.setVisibility(0);
        }
        else {
           LinearLayout ll = (LinearLayout) buttonView.getparent();
           Button b = (Button) ll.findViewById(R.id.deleteButton);
           checked[posSelected] = 1;
           b.setVisibility(8);
        }
    }
});

最後に、削除ボタンのリスナーで:

deleteButton.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v) {

        if(rowID > 0) {
            //Log.d(TAG, "Button Click. rowID = "+rowID);                   

            myDbHelper.deleteRecordWithID(rowID);
            cursor.requery();
            notifyDataSetChanged();
            initializeChecked();  // re-set the checked array
        }                           
    }
}); 
于 2012-05-10T12:28:06.720 に答える
0

このリンクを確認してください。ボタンの状態を配列リストに保存し、リンク上のコードを理解できない場合は、ボタンを直接表示として設定するのではなく、その配列リストからボタンを表示する必要があります。あなたのためのコードは、あなたが理解しているかどうかを教えてください...

すべてのチェックボックスの状態を取得し、チェックされた項目の値を arraylist に追加するボタンを実装する方法は?

正確にはわかりませんが、問題が似ている場合はうまくいくはずです..

于 2012-05-10T12:03:31.863 に答える