【问题标题】:how to select all checkbox in custom listview from activity in android如何从android中的活动中选择自定义列表视图中的所有复选框
【发布时间】:2014-09-16 14:47:05
【问题描述】:

我有一个自定义列表视图,其中包含两个文本视图和一个复选框。当复选框被选中时,id 将存储在数据库中,如果未选中,则 id 将从数据库中删除。但我想选择所有复选框并将所有 id 存储到数据库中,或者取消选中所有复选框并从数据库中删除所有 id。我到底要为此实施什么。请帮帮我这是我的适配器代码

public class InviteListAdapter2 extends BaseAdapter implements OnClickListener {

private static final String TAG = "GroupEditMemberListAdapter";

private LayoutInflater inflater;
private ViewHolder holder;
private List<FriendItem> list;
private Context context;
private ImageLoader imageLoader;
MessageSendingActivity msg = new MessageSendingActivity();
private String groupId;
SqliteHandle sqhandle;
//private String adminId;
int total_contacts=0;
String f_id;
int flag=0;
String chetimeslot;
ArrayList<String> currentList = new ArrayList<String>();
public static final String DELETE_MEMBER = "2";
public static final String ADD_MEMBER = "1";

public InviteListAdapter2(Context context, List<FriendItem> list, String groupId, String adminId) {
    this.context = context;
    inflater = LayoutInflater.from(context);
    this.list = list;
    imageLoader = new ImageLoader(context);
    this.groupId = groupId;
    //this.adminId = adminId;
}   

public ArrayList<String> getChekedItem()
{
    if(currentList!=null)
    return this.currentList;
    else return null;
}
@Override
public int getCount() {
    return list.size();
}

@Override
public Object getItem(int position) {
    return list.get(position);
}

@Override
public long getItemId(int position) {
    return list.indexOf(getItem(position));
}

public void refresh(List<FriendItem> list) {
    this.list = list;
    notifyDataSetChanged();
}

public List<FriendItem> getList() {
    return list;
}

View hView;

ArrayList<CheckedItem> checkbox_timeslot = new ArrayList<CheckedItem>();
@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    hView = convertView;

    final FriendItem item = list.get(position);

    if (convertView == null) {

        holder = new ViewHolder();

        hView = inflater.inflate(R.layout.friendlistitem, null);
        holder.nameTextView         = (TextView) hView.findViewById(R.id.friend_name_text);
        holder.statusTextView       = (TextView) hView.findViewById(R.id.friend_count_text);
        holder.userImageView        = (ImageView) hView.findViewById(R.id.friend_image);
        holder.checkBox             = (CheckBox) hView.findViewById(R.id.chekbox);

        hView.setTag(holder);
    }
    else {
        holder = (ViewHolder) hView.getTag();
    }

    try {
            holder.nameTextView.setText(""+item.getName() + " " +item.getLname());
            holder.statusTextView.setText(""+item.getContacts());

            String path = "http://www.gbggoa.org/testproject/four/images/pic.jpg";
            path = Constant.URL  + item.getImage();
            imageLoader.displayImage(path, holder.userImageView);

            if(item.getId().equals(Sessions.getUserId(context)))
            {
                holder.checkBox.setVisibility(View.GONE);
            }
            else
            {
                holder.checkBox.setVisibility(View.VISIBLE);
            }

            if(item.isChecked())
            {
                holder.checkBox.setChecked(true);

                if(item.getId().equals(Sessions.getUserId(context)))
                {
                    hView.setBackgroundResource(R.drawable.selector_list_gray);
                }
                else
                {
                    hView.setBackgroundResource(R.drawable.selector_list_green);
                }
            }
            else
            {
                holder.checkBox.setChecked(false);
                hView.setBackgroundResource(R.drawable.selector_list);
            }   

            holder.checkBox.setTag(position);
            holder.checkBox.setOnClickListener(this);

    } catch (Exception e) {
        e.printStackTrace();
    }

    return hView;
}   

class ViewHolder
{   
    TextView nameTextView, statusTextView;
    ImageView userImageView;
    CheckBox checkBox;
}

protected void showToast(String message) {
    Toast.makeText(context, ""+message, Toast.LENGTH_SHORT).show();
}

protected void showToastLong(String message) {
    Toast.makeText(context, ""+message, Toast.LENGTH_LONG).show();
}   

@Override
public void onClick(View view) {

    final int position = (Integer) view.getTag();
    String f_id=list.get(position).getId();
    final CheckBox checkBox = (CheckBox) view.findViewById(R.id.chekbox);
    sqhandle=new SqliteHandle(context); 
    final boolean isChecked = checkBox.isChecked();
    int total=sqhandle.getCheckedCount();                       
    checkBox.setVisibility(View.GONE);
    if(isChecked)
    {
        total_contacts = total_contacts + Integer.parseInt(list.get(position).getContacts());
        sqhandle.changeCheck("1", f_id);
        Toast.makeText(context, "Selected Contacts: "+total_contacts, Toast.LENGTH_LONG).show();

    }
    else
    {
        sqhandle.changeCheck("0", f_id);
        total_contacts = total_contacts - Integer.parseInt(list.get(position).getContacts());
        Toast.makeText(context, "Selected Contacts: "+total_contacts, Toast.LENGTH_LONG).show();
    }
    sqhandle.close();
    checkBox.setVisibility(View.VISIBLE);
    list.get(position).setChecked(isChecked);
    notifyDataSetChanged();

}


}   

【问题讨论】:

    标签: android checkbox custom-lists


    【解决方案1】:

    尝试以下方法:

    1. 在活动布局的列表视图顶部添加一个复选框。例如一个 ID 为 chkall 的复选框。

    2. 使用 getter 和 setter 在适配器类 InviteListAdapter2 中添加一个名为 checkedAll 的布尔标志。

    3. 创建以添加/从数据库中删除如下:

      public void modifyFriends(List<FriendItem> fList, boolean checkedAll){
          String checkStatus = "0";   
          if(checkedAll){
              checkStatus = "1";
          }
          //sql code to change check status in database for all friends
      }
      
    4. 修改getView()你的适配器代码如下:

      if(item.isChecked() || checkedAll)
          {
              holder.checkBox.setChecked(true);
      
              if(item.getId().equals(Sessions.getUserId(context)))
              {
                  hView.setBackgroundResource(R.drawable.selector_list_gray);
              }
              else
              {
                  hView.setBackgroundResource(R.drawable.selector_list_green);
              }
          }
          else
          {
              holder.checkBox.setChecked(false);
              hView.setBackgroundResource(R.drawable.selector_list);
          }
      
    5. 点击chkall复选框,执行以下操作:

          if(checked){
              inviteListAdapter2.setCheckedAll(true);
              modifyFriends(friendsList, true); //call a db helper method to change reflect check status in db
          }else{
              inviteListAdapter2.setCheckedAll(false);
              modifyFriends(friendsList, false); //call a db helper method to change reflect check status in db
          }
          inviteListAdapter2.notifyDatasetChaged();
      

    【讨论】:

      【解决方案2】:

      使用 ArrayList 来存储您的项目 ID

      ArrayList<Integer> tcontact = new ArrayList<Integer>();
       if(isChecked)
          {
               tcontact.add(Integer.parseInt(list.get(position).getContacts()))
              sqhandle.changeCheck("1", f_id);
              Toast.makeText(context, "Selected Contacts: "+total_contacts, Toast.LENGTH_LONG).show();
      
          }
          else
          {
            for(int i=0;i<tcontact.size;i++) {
            if(tcontact.get(i) == Integer.parseInt(list.get(position).getContacts())) {
            tcontact.remove(i);
            sqhandle.changeCheck("0", f_id);
      
              Toast.makeText(context, "Selected Contacts: "+total_contacts, Toast.LENGTH_LONG).show();
      }
      }}
      

      【讨论】:

      • 我必须添加另一个复选框来检查列表视图中的所有其他复选框。以及在哪里添加该复选框?在我的活动布局或适配器布局中?
      • 它只是一个 ArrayList,它是一个用于存储您点击的项目的集合
      【解决方案3】:

      nAmDev,

      我听到您所说的关于添加一个复选框来处理用户事件,表示用户希望在选中“全部选中”复选框时将所有项目的复选框设置为选中,或者取消选择所有列表当“全选”复选框未选中或清除时,项目的复选框。

      所以,要做到这一点,是的,您需要添加一个“检查所有”复选框,或者可能是一个操作栏菜单项,以便为用户提供一种方法来执行检查列表中的所有项目。

      在“检查所有”控件的单击事件处理程序中,您将获得对列表的引用,或使用 Nadir B 描述的 ArrayList,并使用它来循环并检查每个项目。

      我不确定是否有办法创建对列表的引用,然后执行类似于 myList.SelectAll 或 myList.CheckAll 的操作。

      如果没有,并且您想做类似的事情,您可以扩展 ListView 并创建自己的 CheckAll 或 SelectAll 方法,然后您将在其中获取列表项的集合,并将每个项设置为选中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多