我如何知道使用复选框和列表视图检查了哪一行?

Posted

技术标签:

【中文标题】我如何知道使用复选框和列表视图检查了哪一行?【英文标题】:How can I know which row is checked using checkbox and listview? 【发布时间】:2020-04-20 00:15:56 【问题描述】:

    下面是ListView项类

     public class CategoryItem06 
    
     private String text;
     private boolean checked;
    
     public void setText(String text) 
     this.text = text;
     
    
     public String getText() 
     return this.text;
     
    
     //    public void setCheck(boolean checked) 
     this.checked = checked;
     
    
     //    public boolean getCheck() 
     return this.checked;
     
     
    

    下面是适配器

    public class CategoryAdapter06 extends BaseAdapter 
    
      public ArrayList<CategoryItem06> listViewItemList = new ArrayList<CategoryItem06>() ;
    
      public CategoryAdapter06() 
    
      
    
      @Override
      public int getCount() 
      return listViewItemList.size() ;
      
    
      @Override
      public View getView(int position, View convertView, ViewGroup parent) 
    
      final int pos = position;
      final Context context = parent.getContext();
    
      if (convertView == null) 
        LayoutInflater inflater = (LayoutInflater) 
        context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.category_item06, parent, false);
       
    
      TextView textTextView = (TextView) convertView.findViewById(R.id.textView1) ;
      CheckBox checkBox=(CheckBox) convertView.findViewById(R.id.checkBoxMafia);
    
      CategoryItem06 listViewItem = listViewItemList.get(position);
    
      textTextView.setText(listViewItem.getText());
      checkBox.setChecked(listViewItem.getCheck());
      return convertView;
      
    
      @Override
      public long getItemId(int position) 
      return position ;
      
    
      @Override
      public Object getItem(int position) 
      return listViewItemList.get(position) ;
      
    
      public void addItem( String text) 
      CategoryItem06 item = new CategoryItem06();
      item.setText(text);
    
      listViewItemList.add(item);
      
      
    

    下面是可检查的相对布局

    public class CategoryCheckableRelativeLayout extends RelativeLayout implements Checkable 
    
    public CategoryCheckableRelativeLayout(Context context, AttributeSet attrs) 
    super(context, attrs);
    // mIsChecked = false ;
    
    @Override
    public boolean isChecked() 
    CheckBox cb = (CheckBox) findViewById(R.id.checkBoxMafia);
    return cb.isChecked();
    // return mIsChecked ;
    
    
    @Override
    public void toggle() 
    CheckBox cb = (CheckBox) findViewById(R.id.checkBoxMafia);
    
    setChecked(cb.isChecked() ? false : true);
    // setChecked(mIsChecked ? false : true) ;
    
    
    @Override
    public void setChecked(boolean checked) 
    CheckBox cb = (CheckBox) findViewById(R.id.checkBoxMafia);
    
    if (cb.isChecked() != checked) 
        cb.setChecked(checked);
    
     
    
    

    下面是使用ListView的Activity

    public class CategorySelection06 extends AppCompatActivity 
    Singleton s1 = Singleton.getInstance();
    ListView listview;
    // Creating Adapter
    CategoryAdapter06 adapter = new CategoryAdapter06();
    
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_category_selection06);
    
    listview = (ListView) findViewById(R.id.listview1);
    listview.setAdapter(adapter);
    
    // Adding Items
    adapter.addItem("Pets");
    adapter.addItem("Singers");
    adapter.addItem("Game");
    adapter.addItem("Nations");
    
    Button button = findViewById(R.id.button6);
    
    button.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            for (int i = 0; i < adapter.listViewItemList.size(); i++) 
                if (adapter.listViewItemList.get(i).getCheck()) 
                    s1.ListViewCategory.add(adapter.listViewItemList.get(i).getText());
                
            
            Intent intent = new Intent(getApplicationContext(), RoleSelection07.class);
            startActivity(intent);
            finish();
            
       );
     
     
    

我的ListView的表单是这样的:TextView ------- Checkbox

我想做一个这样的活动:如果用户选中复选框,则选中的行的文本保存在 Singleton 类的 ArrayList 中。

例如,如果用户选中“Pets”和“Nations”复选框,那么这些词将进入 ArrayList s1.ListViewCategory,它位于 Singleton 类中。

我在 CategorySelectionActivity 中尝试过 for 循环和 if 语句,如下所示:

    button.setOnClickListener(new View.OnClickListener() 
    @Override
        public void onClick(View view) 
            for (int i = 0; i < adapter.listViewItemList.size(); i++) 
                if (adapter.listViewItemList.get(i).getCheck()) 
                    s1.ListViewCategory.add(adapter.listViewItemList.get(i).getText());
                
            
            Intent intent = new Intent(getApplicationContext(), RoleSelection07.class);
            startActivity(intent);
            finish();
            

但是,getCheck() 不起作用,因为 setCheck() 不在 CategoryAdapter 类的 addItem() 中。

我尝试将setCheck()放在addItem()方法中,但后来我必须在add()中放另一个参数,然后出现红线和错误。

由于我是新手,我从网站上复制了这些代码,但我并没有真正理解使用 CheckableRelativeLayout 的想法。

此布局显示复选框是否被选中,但不表示选中了哪一行。

总而言之,我的问题是'如何从被检查的多行中获取文本,并知道检查了哪一行?

我知道这个问题很长,但我真的需要解决这个问题...... 如果有人回答我的问题,我将非常感激谢谢

【问题讨论】:

【参考方案1】:

没有人回答,所以我自己修好了。

 SparseBooleanArray checkedItems = listview.getCheckedItemPositions();
            int count = adapter.getCount(); 

            for (int i = 0; i < count; i++) 
                if (checkedItems.get(i)) 
                    s1.ListViewCategory.add(adapter.listViewItemList.get(i).getText());
                
            
            listview.clearChoices();
            Intent intent = new Intent(getApplicationContext(), RoleSelection07.class);
            startActivity(intent);
            finish();

【讨论】:

以上是关于我如何知道使用复选框和列表视图检查了哪一行?的主要内容,如果未能解决你的问题,请参考以下文章

通过列表视图检查动态生成的复选框时出现问题

VBA 如何确定在列表框中选择了哪一行?

Django 2.2 如何在列表视图中禁用复选框

如何知道在相对布局中单击了哪个子视图

在列表视图上检查项目时启动新活动

反应本机列表视图