ListView中行的位置选中了checkBox

时间:2012-05-10 11:14:44

标签: android listview checkbox custom-cursor

我有一个listView,其中每一行都包含一个checkBox,TextView和Button。 该按钮设置为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);
}

}

修改

我的新代码与巴拉克的建议。第一个版本工作但是一旦删除了一行,一旦视图刷新,将检查它下面的行。现在我在getView()中得到cursorOutOfBoundsException

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++;
    }
}

}

2 个答案:

答案 0 :(得分: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
        }                           
    }
}); 

答案 1 :(得分:0)

检查此链接 你需要做的是你必须在一个arraylist中保存你的按钮状态,然后显示你的按钮,而不是直接将其设置为可见如果你无法理解链接上的代码然后我会尝试为你编写代码让我知道你有没有理解......

How to implement a button that gets all checkbox's state and adds the value of checked item into arraylist?

我不确切知道,但如果问题类似,它应该有效。