1

我有一个listView,其中每一行都包含一个checkBox、TextView 和Button。该按钮设置为 GONE。当用户选择文本框时,我希望按钮变得可见。然后用户将单击此按钮以删除该行。

我已经为 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() 中得到了一个。

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;

在您的构造函数中,将光标设置为本地 var 并调用一个方法:

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 回答