Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用Listview中的复选框获取所选项目_Android_Listview - Fatal编程技术网

Android 使用Listview中的复选框获取所选项目

Android 使用Listview中的复选框获取所选项目,android,listview,Android,Listview,我正在创建一个Android应用程序,其中我有一个列表视图,显示安装在我手机上的所有应用程序 我的ListView是定制的,它包含一个图标、TextView和复选框,图标的用途是显示应用程序的图标,TextView是显示应用程序的名称,复选框的用途是确定我在ListView中选择的项目 在应用程序中单击按钮时,如何确定在ListView行中选择的复选框是什么?我是Android新手,所以我不知道该怎么做 这是我的密码: public class AppInfo { public Draw

我正在创建一个Android应用程序,其中我有一个列表视图,显示安装在我手机上的所有应用程序

我的ListView是定制的,它包含一个图标、TextView和复选框,图标的用途是显示应用程序的图标,TextView是显示应用程序的名称,复选框的用途是确定我在ListView中选择的项目

在应用程序中单击按钮时,如何确定在ListView行中选择的复选框是什么?我是Android新手,所以我不知道该怎么做

这是我的密码:

public class AppInfo {
    public Drawable icon;
    public String applicationName;

    public AppInfo(){
        super();
    }

    public AppInfo(Drawable icon, String applicationName){
        super();
        this.icon = icon;
        this.applicationName = applicationName;
    }


}


导入android.app.Activity;
导入android.content.pm.ApplicationInfo;
导入android.content.pm.PackageManager;
导入android.os.Bundle;
导入android.widget.ArrayAdapter;
导入android.widget.BaseAdapter;
导入android.widget.ListView;
导入android.widget.TextView;
导入java.util.ArrayList;
导入java.util.List;
导入android.content.pm.PackageInfo;
公共类CacheActivity扩展了活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u缓存);
最终ListView listApplication=(ListView)findViewById(R.id.listApplication);
ApplicationInfo ApplicationInfo=getApplicationInfo();
PackageManager pm=getPackageManager();
List pInfo=new ArrayList();
pInfo.addAll(pm.getInstalledPackages(0));
AppInfo app_info[]=新AppInfo[pInfo.size()];
int计数器=0;
用于(PackageInfo项目:pInfo){
试一试{
applicationInfo=pm.getApplicationInfo(item.packageName,1);
应用程序信息[计数器]=新的应用程序信息(pm.getApplicationInfo(applicationInfo),
valueOf(pm.getApplicationLabel(applicationInfo));
系统输出打印项次(计数器);
}
捕获(例外e){
System.out.println(e.getMessage());
}
计数器++;
}
AppInfoAdapter=新的AppInfoAdapter(此,R.layout.listview\u item\u行,app\u info);
setAdapter(适配器);
}
}

您必须向listview添加一个McClickListener,以确定单击了哪个项目,然后找到复选框

mListView.setOnItemClickListener(new OnItemClickListener()
{
    @Override
    public void onItemClick(AdapterView<?> parent, View v, int position, long id)
    {
        CheckBox cb = (CheckBox) v.findViewById(R.id.checkbox_id);
    }
});
public class CustomAdapter  extends BaseAdapter {

    private Context context;
    public static ArrayList<Model> modelArrayList;


    public CustomAdapter(Context context, ArrayList<Model> modelArrayList) {

        this.context = context;
        this.modelArrayList = modelArrayList;

    }

    @Override
    public int getViewTypeCount() {
        return getCount();
    }
    @Override
    public int getItemViewType(int position) {

        return position;
    }

    @Override
    public int getCount() {
        return modelArrayList.size();
    }

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

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;

        if (convertView == null) {
            holder = new ViewHolder(); LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.lv_item, null, true);

            holder.checkBox = (CheckBox) convertView.findViewById(R.id.cb);
            holder.tvAnimal = (TextView) convertView.findViewById(R.id.animal);

            convertView.setTag(holder);
        }else {
            // the getTag returns the viewHolder object set as a tag to the view
            holder = (ViewHolder)convertView.getTag();
        }


        holder.checkBox.setText("Checkbox "+position);
        holder.tvAnimal.setText(modelArrayList.get(position).getAnimal());

        holder.checkBox.setChecked(modelArrayList.get(position).getSelected());

        holder.checkBox.setTag(R.integer.btnplusview, convertView);
        holder.checkBox.setTag( position);
        holder.checkBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                View tempview = (View) holder.checkBox.getTag(R.integer.btnplusview);
                TextView tv = (TextView) tempview.findViewById(R.id.animal); 
                Integer pos = (Integer)  holder.checkBox.getTag();
                Toast.makeText(context, "Checkbox "+pos+" clicked!", Toast.LENGTH_SHORT).show();

                if(modelArrayList.get(pos).getSelected()){
                    modelArrayList.get(pos).setSelected(false);
                }else {
                    modelArrayList.get(pos).setSelected(true);
                }

            }
        });

        return convertView;
    }

    private class ViewHolder {

        protected CheckBox checkBox;
        private TextView tvAnimal;

    }

}
mListView.setOnItemClickListener(新的OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父视图、视图v、整型位置、长id)
{
复选框cb=(复选框)v.findViewById(R.id.CheckBox\u id);
}
});

假设您希望获取其复选框在单击按钮时被选中的行项目。假设基于您的标题“单击按钮时使用Listview中的复选框获取所选项目”

试试下面的方法。只做如下更改。其余的保持不变

关于该专题的解释和讨论@

MainActivity.java

public class MainActivity extends Activity {
     AppInfoAdapter adapter ;
     AppInfo app_info[] ;
        @Override
        protected void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);


            final ListView listApplication = (ListView)findViewById(R.id.listApplication);
            Button b= (Button) findViewById(R.id.button1);
            b.setOnClickListener(new OnClickListener()
            {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub

                    StringBuilder result = new StringBuilder();
                    for(int i=0;i<adapter.mCheckStates.size();i++)
                    {
                        if(adapter.mCheckStates.get(i)==true)
                        {

                                           result.append(app_info[i].applicationName);
                            result.append("\n");
                        }

                    }
                    Toast.makeText(MainActivity.this, result, 1000).show();
                }

            });

            ApplicationInfo applicationInfo = getApplicationInfo();
            PackageManager pm = getPackageManager();
            List<PackageInfo> pInfo = new ArrayList<PackageInfo>();
            pInfo.addAll(pm.getInstalledPackages(0));
            app_info = new AppInfo[pInfo.size()];

            int counter = 0;
            for(PackageInfo item: pInfo){
                try{

                    applicationInfo = pm.getApplicationInfo(item.packageName, 1);

                    app_info[counter] = new AppInfo(pm.getApplicationIcon(applicationInfo), 
                            String.valueOf(pm.getApplicationLabel(applicationInfo)));

                    System.out.println(counter);

                }
                catch(Exception e){
                     System.out.println(e.getMessage());
                }

                counter++;
            }

           adapter = new AppInfoAdapter(this, R.layout.listview_item_row, app_info);
            listApplication.setAdapter(adapter);

        }
}
公共类MainActivity扩展活动{
AppInfoAdapter;
AppInfo app_info[];
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
最终ListView listApplication=(ListView)findViewById(R.id.listApplication);
按钮b=(按钮)findViewById(R.id.button1);
b、 setOnClickListener(新的OnClickListener()
{
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
StringBuilder结果=新建StringBuilder();

对于(int i=0;i我也有类似的问题。提供的xml示例作为单个ListViewItem放置,我无法单击项本身,但复选框起作用

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="50dp"
    android:id="@+id/source_container"
    >
    <ImageView
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:id="@+id/menu_source_icon"
        android:background="@drawable/bla"
        android:layout_margin="5dp"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/menu_source_name"
        android:text="Test"
        android:textScaleX="1.5"
        android:textSize="20dp"
        android:padding="8dp"
        android:layout_weight="1"
        android:layout_gravity="center_vertical"
        android:textColor="@color/source_text_color"/>
    <CheckBox
        android:layout_width="40dp"
        android:layout_height="match_parent"
        android:id="@+id/menu_source_check_box"/>

</LinearLayout>

复选框控件。

这是一个简化,但非常简单。。。 如前所述,您需要将焦点标志添加到复选框中。 您还需要添加clickable标志,如下所示:

android:focusable="false"
android:clickable="false"
然后从
ListView
ListFragment
在我的例子中)中控制复选框状态
onListItemClick
事件

这是示例onListItemClick方法:

public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
//Get related checkbox and change flag status..
CheckBox cb = (CheckBox)v.findViewById(R.id.rowDone);
cb.setChecked(!cb.isChecked());
Toast.makeText(getActivity(), "Click item", Toast.LENGTH_SHORT).show();
}

[带复选框的自定义ListView]

如果customlayout使用复选框,则必须将复选框设置为focusable=false

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">

  <TextView android:id="@+id/rowTextView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:textSize="16sp" >
  </TextView>

  <CheckBox android:id="@+id/CheckBox01" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:padding="10dp"
    android:layout_alignParentRight="true" 
    android:layout_marginRight="6sp"
    android:focusable="false">           // <---important
  </CheckBox>

</RelativeLayout>


//使复选框不可聚焦,然后在列表项上单击执行此操作, 这里codevalue是位置

    Arraylist<Integer> selectedschools=new Arraylist<Integer>();

    lvPickSchool.setOnItemClickListener(new AdapterView.OnItemClickListener() 
  {

   @Override
        public void onItemClick(AdapterView<?> parent, View view, int codevalue, long id)
   {
                      CheckBox cb = (CheckBox) view.findViewById(R.id.cbVisitingStatus);

            cb.setChecked(!cb.isChecked());
            if(cb.isChecked())
            {

                if(!selectedschool.contains(codevaule))
                {
                    selectedschool.add(codevaule);
                }
            }
            else
            {
                if(selectedschool.contains(codevaule))
                {
                    selectedschool.remove(codevaule);
                }
            }
        }
    });
arraylistselectedschools=newarraylist();
lvPickSchool.setOnItemClickListener(新的AdapterView.OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父级、视图、int-codevalue、长id)
{
复选框cb=(复选框)view.findViewById(R.id.cbVisitingStatus);
cb.setChecked(!cb.isChecked());
if(cb.isChecked())
{
如果(!selectedschool.contains(codevaule))
{
选择学校。添加(代码规则);
}
}
其他的
{
如果(所选学校包含(代码规则))
{
所选学校。删除(codevaule);
}
}
}
});
“复选框用于确定我在列表视图中选择的项目”

  • 只需在Adapter类中使用setTag()方法将标记添加到复选框中,另一端使用getTag()方法

  • 在复选框的xml代码中,只需输入“android:onClick=“your method”属性

         <CheckBox
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="checkboxClicked"  
                android:id="@+id/checkBox_Service_row"
                android:layout_marginRight="5dp"
                android:layout_alignParentTop="true"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true" />
    

  • 完整参考资料,请参阅: 将所选项目传递给下一个活动

    主要源代码如下

    首先创建一个模型类

    public class Model {
    
        private boolean isSelected;
        private String animal;
    
        public String getAnimal() {
            return animal;
        }
    
        public void setAnimal(String animal) {
            this.animal = animal;
        }
    
        public boolean getSelected() {
            return isSelected;
        }
    
        public void setSelected(boolean selected) {
            isSelected = selected;
        }
    }
    
    然后在适配器类中,将标记设置为复选框
    public void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    //Get related checkbox and change flag status..
    CheckBox cb = (CheckBox)v.findViewById(R.id.rowDone);
    cb.setChecked(!cb.isChecked());
    Toast.makeText(getActivity(), "Click item", Toast.LENGTH_SHORT).show();
    }
    
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent">
    
      <TextView android:id="@+id/rowTextView" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:textSize="16sp" >
      </TextView>
    
      <CheckBox android:id="@+id/CheckBox01" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:padding="10dp"
        android:layout_alignParentRight="true" 
        android:layout_marginRight="6sp"
        android:focusable="false">           // <---important
      </CheckBox>
    
    </RelativeLayout>
    
        Arraylist<Integer> selectedschools=new Arraylist<Integer>();
    
        lvPickSchool.setOnItemClickListener(new AdapterView.OnItemClickListener() 
      {
    
       @Override
            public void onItemClick(AdapterView<?> parent, View view, int codevalue, long id)
       {
                          CheckBox cb = (CheckBox) view.findViewById(R.id.cbVisitingStatus);
    
                cb.setChecked(!cb.isChecked());
                if(cb.isChecked())
                {
    
                    if(!selectedschool.contains(codevaule))
                    {
                        selectedschool.add(codevaule);
                    }
                }
                else
                {
                    if(selectedschool.contains(codevaule))
                    {
                        selectedschool.remove(codevaule);
                    }
                }
            }
        });
    
          @Override
       public void onBindViewHolder(MyViewHolder holder, int position) {
    
    ServiceHelper helper=userServices.get(position);
    holder.tvServiceName.setText(helper.getServiceName());
    
    if(!helper.isServiceStatus()){
    
        holder.btnAdd.setVisibility(View.VISIBLE);
        holder.btnAdd.setTag(helper.getServiceName());
        holder.checkBoxServiceStatus.setVisibility(View.INVISIBLE);
    
    }else{
    
        holder.checkBoxServiceStatus.setVisibility(View.VISIBLE);
           //This Line
        holder.checkBoxServiceStatus.setTag(helper.getServiceName());
        holder.btnAdd.setVisibility(View.INVISIBLE);
    
       }
    
    }
    
         <CheckBox
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="checkboxClicked"  
                android:id="@+id/checkBox_Service_row"
                android:layout_marginRight="5dp"
                android:layout_alignParentTop="true"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true" />
    
         protected void checkboxClicked(View view)
          {
    
            CheckBox checkBox=(CheckBox) view;
              String tagName="";
             if(checkBox.isChecked()){
               tagName=checkBox.getTag().toString();
               deleteServices.add(tagName);
               checkboxArrayList.add(checkBox);
            }else {
                   checkboxArrayList.remove(checkBox);
                   tagName=checkBox.getTag().toString();
                        if(deleteServices.size()>0&&deleteServices.contains(tagName)){
     deleteServices.remove(tagName);
        }
      }
    }
    
    public class Model {
    
        private boolean isSelected;
        private String animal;
    
        public String getAnimal() {
            return animal;
        }
    
        public void setAnimal(String animal) {
            this.animal = animal;
        }
    
        public boolean getSelected() {
            return isSelected;
        }
    
        public void setSelected(boolean selected) {
            isSelected = selected;
        }
    }
    
    public class CustomAdapter  extends BaseAdapter {
    
        private Context context;
        public static ArrayList<Model> modelArrayList;
    
    
        public CustomAdapter(Context context, ArrayList<Model> modelArrayList) {
    
            this.context = context;
            this.modelArrayList = modelArrayList;
    
        }
    
        @Override
        public int getViewTypeCount() {
            return getCount();
        }
        @Override
        public int getItemViewType(int position) {
    
            return position;
        }
    
        @Override
        public int getCount() {
            return modelArrayList.size();
        }
    
        @Override
        public Object getItem(int position) {
            return modelArrayList.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return 0;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            final ViewHolder holder;
    
            if (convertView == null) {
                holder = new ViewHolder(); LayoutInflater inflater = (LayoutInflater) context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.lv_item, null, true);
    
                holder.checkBox = (CheckBox) convertView.findViewById(R.id.cb);
                holder.tvAnimal = (TextView) convertView.findViewById(R.id.animal);
    
                convertView.setTag(holder);
            }else {
                // the getTag returns the viewHolder object set as a tag to the view
                holder = (ViewHolder)convertView.getTag();
            }
    
    
            holder.checkBox.setText("Checkbox "+position);
            holder.tvAnimal.setText(modelArrayList.get(position).getAnimal());
    
            holder.checkBox.setChecked(modelArrayList.get(position).getSelected());
    
            holder.checkBox.setTag(R.integer.btnplusview, convertView);
            holder.checkBox.setTag( position);
            holder.checkBox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    View tempview = (View) holder.checkBox.getTag(R.integer.btnplusview);
                    TextView tv = (TextView) tempview.findViewById(R.id.animal); 
                    Integer pos = (Integer)  holder.checkBox.getTag();
                    Toast.makeText(context, "Checkbox "+pos+" clicked!", Toast.LENGTH_SHORT).show();
    
                    if(modelArrayList.get(pos).getSelected()){
                        modelArrayList.get(pos).setSelected(false);
                    }else {
                        modelArrayList.get(pos).setSelected(true);
                    }
    
                }
            });
    
            return convertView;
        }
    
        private class ViewHolder {
    
            protected CheckBox checkBox;
            private TextView tvAnimal;
    
        }
    
    }
    
    public class Model {
    
        private boolean isSelected;
        private String animal;
    
        public String getAnimal() {
            return animal;
        }
    
        public void setAnimal(String animal) {
            this.animal = animal;
        }
    
        public boolean getSelected() {
            return isSelected;
        }
    
        public void setSelected(boolean selected) {
            isSelected = selected;
        }
    }
    
     holder.checkBox.setTag(R.integer.btnplusview, convertView);
            holder.checkBox.setTag( position);
            holder.checkBox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    View tempview = (View) holder.checkBox.getTag(R.integer.btnplusview);
                    TextView tv = (TextView) tempview.findViewById(R.id.animal); 
                    Integer pos = (Integer)  holder.checkBox.getTag();
                    Toast.makeText(context, "Checkbox "+pos+" clicked!", Toast.LENGTH_SHORT).show();
    
                    if(modelArrayList.get(pos).getSelected()){
                        modelArrayList.get(pos).setSelected(false);
                    }else {
                        modelArrayList.get(pos).setSelected(true);
                    }
    
                }
            });
    
    public class CustomAdapter  extends BaseAdapter {
    
        private Context context;
        public static ArrayList<Model> modelArrayList;
    
    
        public CustomAdapter(Context context, ArrayList<Model> modelArrayList) {
    
            this.context = context;
            this.modelArrayList = modelArrayList;
    
        }
    
        @Override
        public int getViewTypeCount() {
            return getCount();
        }
        @Override
        public int getItemViewType(int position) {
    
            return position;
        }
    
        @Override
        public int getCount() {
            return modelArrayList.size();
        }
    
        @Override
        public Object getItem(int position) {
            return modelArrayList.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return 0;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            final ViewHolder holder;
    
            if (convertView == null) {
                holder = new ViewHolder(); LayoutInflater inflater = (LayoutInflater) context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.lv_item, null, true);
    
                holder.checkBox = (CheckBox) convertView.findViewById(R.id.cb);
                holder.tvAnimal = (TextView) convertView.findViewById(R.id.animal);
    
                convertView.setTag(holder);
            }else {
                // the getTag returns the viewHolder object set as a tag to the view
                holder = (ViewHolder)convertView.getTag();
            }
    
    
            holder.checkBox.setText("Checkbox "+position);
            holder.tvAnimal.setText(modelArrayList.get(position).getAnimal());
    
            holder.checkBox.setChecked(modelArrayList.get(position).getSelected());
    
            holder.checkBox.setTag(R.integer.btnplusview, convertView);
            holder.checkBox.setTag( position);
            holder.checkBox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    View tempview = (View) holder.checkBox.getTag(R.integer.btnplusview);
                    TextView tv = (TextView) tempview.findViewById(R.id.animal); 
                    Integer pos = (Integer)  holder.checkBox.getTag();
                    Toast.makeText(context, "Checkbox "+pos+" clicked!", Toast.LENGTH_SHORT).show();
    
                    if(modelArrayList.get(pos).getSelected()){
                        modelArrayList.get(pos).setSelected(false);
                    }else {
                        modelArrayList.get(pos).setSelected(true);
                    }
    
                }
            });
    
            return convertView;
        }
    
        private class ViewHolder {
    
            protected CheckBox checkBox;
            private TextView tvAnimal;
    
        }
    
    }