Android 显示/隐藏自定义适配器中的复选框

Android 显示/隐藏自定义适配器中的复选框,android,listview,adapter,Android,Listview,Adapter,我想在自定义适配器中显示/隐藏复选框,但在3天的搜索中找不到任何解决方案 在“我的自定义适配器”中,当用户单击“显示”按钮并使其可见时,所有复选框都默认隐藏,然后再次单击“不可见”。 这是我的密码 谢谢你的帮助 主要活动 public class PhonebookList extends ListActivity{ private ArrayList<PhoneListView> lists; private ArrayList<String>

我想在自定义适配器中显示/隐藏复选框,但在3天的搜索中找不到任何解决方案

在“我的自定义适配器”中,当用户单击“显示”按钮并使其可见时,所有复选框都默认隐藏,然后再次单击“不可见”。 这是我的密码

谢谢你的帮助

主要活动

public class PhonebookList extends ListActivity{
private ArrayList<PhoneListView>    lists;
private ArrayList<String>           phoneName   = new ArrayList<String>();
private PhoneListAdapter            adapter;
private ListView                    lv;

private RelativeLayout              rl;
private ImageView                   im1;
private ImageView                   im2;

private boolean                     checkUncheck = true;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_phonelist); // Get main display layout

    lv = (ListView) findViewById(android.R.id.list);

    String uniqueName = "";
    int index = 0;
    lists = new ArrayList<PhoneListView>();

    Cursor phones = getContentResolver().query(
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,
            null, null);
    while (phones.moveToNext())
    {
        String name = phones
                .getString(phones
                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
        if(!name.equals(uniqueName))
        {
            uniqueName = name;
            phoneName.add(name);
            lists.add(new PhoneListView(name, index, checkUncheck));

            index++;
        }
        else
        {
            continue;
        }
    }

    int x = lists.size();
    PhoneListView[] toArray = new PhoneListView[x];
    toArray = lists.toArray(toArray);

    adapter = new PhoneListAdapter(this,
            R.layout.custom_phone_listview_rows, toArray); // Layout whose hold rows
    lv.setAdapter(adapter);
    lv.setClickable(true);

    lv.setOnItemClickListener(new OnItemClickListener()
    {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id)
        {
            Intent i = new Intent(getApplicationContext(),
                    PhoneBookDetail.class);
            i.putExtra("id", phoneName.get(position));
            startActivity(i);
        }
    });
}

@Override
protected void onResume()
{
    final ImageView showButton = (ImageView) findViewById(R.id.show_hide_button);
    showButton.setBackgroundResource(R.drawable.icon_choise);

    showButton.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            if(checkUncheck)
            {
                showButton.setBackgroundResource(R.drawable.icon_choise);
                checkUncheck = false;

                rl.setVisibility(View.GONE);
                im1.setVisibility(View.GONE);
                im2.setVisibility(View.GONE);
            }
            else
            {
                showButton.setBackgroundResource(R.drawable.icon_completion);
                checkUncheck = true;

                rl.setVisibility(View.VISIBLE);
                im1.setVisibility(View.VISIBLE);
                im2.setVisibility(View.VISIBLE);
            }
        }
    });

    rl  = (RelativeLayout) findViewById(R.id.show_hide_bar);
    im1 = (ImageView) findViewById(R.id.show_hide_backup);
    im2 = (ImageView) findViewById(R.id.show_hide_checkall);

    rl.setVisibility(View.GONE);
    im1.setVisibility(View.GONE);
    im2.setVisibility(View.GONE);
    super.onResume();
}

public void backupForChecked(View v){
    if(adapter.checkedItem.size() == 0)
        Toast.makeText(getApplicationContext(), "Select atleast one item", Toast.LENGTH_SHORT).show();
    else
    {
        //  Send selected values as Array
        int[] myArray = new int[adapter.checkedItem.size()];

        Bundle b=new Bundle();
        for(int i = 0; i < adapter.checkedItem.size(); i++)
        {
            myArray[i] = Integer.parseInt(adapter.checkedItem.get(i));
        }
        b.putIntArray("contactID", myArray);

        Intent i = new Intent(getApplicationContext(), SaveAllWithoutAsk.class);
        i.putExtra("contactID", myArray);
        startActivity(i);
    }
}

public void checkUncheckAll(View v)
{

}

public void modoru(View v)
{
    finish();
}
  }
和我的自定义适配器

public class PhoneListAdapter extends ArrayAdapter<PhoneListView>{
private Context             context;
private int                 resID;
private PhoneListView[]     data        = null;
public ArrayList<String>    checkedItem = new ArrayList<String>();

public PhoneListAdapter(Context context, int resource,
        PhoneListView[] objects)
{
    super(context, resource, objects);
    this.context = context;
    this.resID = resource;
    this.data = objects;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
    View row = convertView;
    CustomHolder holder = null;

    if (row == null)
    {
        LayoutInflater inflate = ((Activity) context).getLayoutInflater();
        row = inflate.inflate(resID, null);

        holder = new CustomHolder();
        holder.cb = (CheckBox) row.findViewById(R.id.phonelist_checkbox);
        holder.tw = (TextView) row
                .findViewById(R.id.phonelist_contact_name);

        row.setTag(holder);
    }
    else
        holder = (CustomHolder) row.getTag();

    final PhoneListView plv = data[position];
    holder.tw.setText(plv.getName().toString());
    holder.id = plv.getId();

    holder.checked = plv.getItemToggled();

    if (holder.checked == false)
        holder.cb.setVisibility(View.GONE);
    else
    {
        holder.cb.setVisibility(View.VISIBLE);
        holder.cb.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                if (((CompoundButton) v).isChecked())
                {
                    checkedItem.add("" + plv.getId());
                }
                else
                {
                    checkedItem.remove("" + plv.getId());
                }
            }
        });
    }

    return row;
}

public class CustomHolder
{
    CheckBox    cb;
    TextView    tw;
    int         id;
    boolean     checked;
}
  }
屏幕截图在这里


您应该通过调用按钮OnClickListener中的notifyDatasetChanged函数来通知适配器数据集已更改


您还应该删除检查行是否为空。通常,重用视图是一种很好的做法,但由于视图会发生更改,并且在更改设置后需要更新,因此需要重新创建项目。

能否将您用来显示的布局xml文件放入其中? 小部件具有分配给它们的属性,可以根据需要显示/隐藏它们。 检查您的复选框小部件以了解此类属性

问候 普拉萨德

感谢您的回复。 我已经解决了我的问题1我将在这里写下解决方案谁可能会帮助别人的时间和头发

我创建了新的public方法,并在单击show/hide按钮时调用它


现在我仍在研究如何处理选中/取消选中所有复选框,我仍然需要想法和帮助

我认为您可以为复选框的数量创建一个循环,然后遍历循环,即

1您可以有一个名为checkall的方法,其中所有元素都将循环并检查其状态,如果选中,则将保持选中状态,如果未选中,则将被选中

2另一个未选中的方法将被循环,且所有复选框均未选中

3还要看看你是否可以为你的复选框创建一个复选框组

致意

下面的代码是android示例代码中某些代码的修改版本,请查看是否有帮助

选中复选框单击查看时出现公共无效{

// Here you can create an array of the check boxes available in the view .

// create a loop which will check which one of the check boxes is checked and which one is not 
对于

{ 布尔值选中=复选框view.isChecked

// Check which checkbox was clicked
switch(view.getId()) {
    case R.id.checkbox_meat:
        if (checked)
            // Put some meat on the sandwich
        else
            // Remove the meat
        break;
    case R.id.checkbox_cheese:
        if (checked)
            // Cheese me
        else
            // I'm lactose intolerant
        break;
    // TODO: Veggie sandwich

   }
}

}

在Android中,选择列表项是反模式的复选框。请阅读更多感谢回复。我认为您的链接没有涵盖我的情况。感谢回复。我不知道在Android中如何操作。首先,这不是正确的答案。其次,发布完整的答案或在评论部分添加说明。
// Check which checkbox was clicked
switch(view.getId()) {
    case R.id.checkbox_meat:
        if (checked)
            // Put some meat on the sandwich
        else
            // Remove the meat
        break;
    case R.id.checkbox_cheese:
        if (checked)
            // Cheese me
        else
            // I'm lactose intolerant
        break;
    // TODO: Veggie sandwich

   }
}