Android 如何对自定义listview中创建的复选框进行编码

Android 如何对自定义listview中创建的复选框进行编码,android,android-listview,android-studio,android-custom-view,android-checkbox,Android,Android Listview,Android Studio,Android Custom View,Android Checkbox,我已经创建了一个自定义列表视图,其中列出了设备上所有已安装的应用程序,其中包括应用程序图标、应用程序名称和复选框。我想对onCheckboxClicked方法进行编码,但我不知道将其放置在何处,我已经阅读过它应该在适配器中,但我一直在查看的其他示例在主活动中都有代码,我似乎无法让它以任何方式工作 public class MainActivity extends ActionBarActivity { @Override protected void onCreate(

我已经创建了一个自定义列表视图,其中列出了设备上所有已安装的应用程序,其中包括应用程序图标、应用程序名称和复选框。我想对onCheckboxClicked方法进行编码,但我不知道将其放置在何处,我已经阅读过它应该在适配器中,但我一直在查看的其他示例在主活动中都有代码,我似乎无法让它以任何方式工作

    public class MainActivity extends ActionBarActivity {
     @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //retrieve currently installed apps
    final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
    mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
    final List pkgAppsList = getPackageManager().queryIntentActivities( mainIntent, 0);
    List<AppDetails> appList = new ArrayList<>();

    for (Object object : pkgAppsList)
    {
        ResolveInfo info = (ResolveInfo) object;
        Drawable icon    = getBaseContext().getPackageManager().getApplicationIcon(info.activityInfo.applicationInfo);
        String strAppName   = info.activityInfo.applicationInfo.publicSourceDir.toString();
        String strPackageName  = info.activityInfo.applicationInfo.packageName.toString();
        final String title  = (String)((info != null) ? getBaseContext().getPackageManager().getApplicationLabel(info.activityInfo.applicationInfo) : "???");
        AppDetails tmp = new AppDetails(title, icon);
        appList.add(tmp); //add title and icon into list
    }


    final ListView listview = (ListView) findViewById(R.id.listView);
    final AppDetailsAdapter adapter = new AppDetailsAdapter(this, appList);
    listview.setAdapter(adapter);

}
公共类MainActivity扩展了ActionBarActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//检索当前安装的应用程序
最终意图maintent=新意图(Intent.ACTION_MAIN,空);
mainIntent.addCategory(Intent.CATEGORY_启动器);
最终列表pkgAppsList=getPackageManager().QueryInputActivities(mainIntent,0);
List appList=new ArrayList();
for(对象:pkgAppsList)
{
ResolveInfo=(ResolveInfo)对象;
可绘制图标=getBaseContext().getPackageManager().GetApplicationInfo(info.activityInfo.applicationInfo);
String String name=info.activityInfo.applicationInfo.publicSourceDir.toString();
字符串strPackageName=info.activityInfo.applicationInfo.packageName.toString();
最终字符串标题=(字符串)((信息!=null)?getBaseContext().getPackageManager().getApplicationLabel(信息.活动信息.应用信息):“?”;
AppDetails tmp=新的AppDetails(标题、图标);
appList.add(tmp);//将标题和图标添加到列表中
}
最终ListView ListView=(ListView)findViewById(R.id.ListView);
最终AppDetailsAdapter适配器=新的AppDetailsAdapter(这个,appList);
setAdapter(适配器);
}
适配器:

    public class AppDetailsAdapter extends BaseAdapter {

private List<AppDetails> data;
private Context context;

public AppDetailsAdapter(Context context, List<AppDetails> data) {
    this.context = context;
    this.data = data;
}

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

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

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;

    if (view == null) {
        LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = vi.inflate(R.layout.custom_row_layout, null);
    }


    ImageView icon = (ImageView) view.findViewById(R.id.icon);
    TextView text = (TextView) view.findViewById(R.id.text);

    final AppDetails item = data.get(position);

    text.setText(item.name);
    icon.setImageDrawable(item.icon);


    return view;
}
公共类AppDetailsAdapter扩展BaseAdapter{
私人名单数据;
私人语境;
公共AppDetailsAdapter(上下文、列表数据){
this.context=上下文;
这个数据=数据;
}
@凌驾
public int getCount(){
返回data.size();
}
@凌驾
公共对象getItem(int位置){
返回数据。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=转换视图;
如果(视图==null){
LayoutInflater vi=(LayoutInflater)context.getSystemService(context.LAYOUT\u INFLATER\u SERVICE);
视图=vi.充气(R.layout.custom_row_layout,null);
}
ImageView图标=(ImageView)view.findViewById(R.id.icon);
TextView text=(TextView)view.findViewById(R.id.text);
最终AppDetails项=data.get(位置);
text.setText(item.name);
icon.setImageDrawable(item.icon);
返回视图;
}
}

自定义布局:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="60dp"

android:clickable="true"
android:orientation="horizontal"
android:weightSum="1">

<ImageView
    android:id="@+id/icon"
    android:layout_width="39dp"
    android:layout_height="39dp"
    android:layout_gravity="center_vertical"
    android:layout_marginLeft="16dp" />

<TextView
    android:id="@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerVertical="true"
    android:layout_gravity="center_vertical"
    android:layout_marginLeft="16dp"
    android:textSize="17sp" />
<LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="right" >

    <CheckBox
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/checkBox"
        android:onClick="onCheckboxClicked"/>/>


</LinearLayout>

/>


我还了解到,需要修改getView方法来处理复选框,但我似乎无法用我迄今为止尝试过的方法来完成此操作

将适配器的get view代码替换为以下代码:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;

    if (view == null) {
        LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = vi.inflate(R.layout.custom_row_layout, null);
    }


    ImageView icon = (ImageView) view.findViewById(R.id.icon);
    TextView text = (TextView) view.findViewById(R.id.text);

CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkBox);

    final AppDetails item = data.get(position);

    text.setText(item.name);
    icon.setImageDrawable(item.icon);

    checkBox .setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // Handle your conditions here

            }
        });


    return view;
}

这里
setOnCheckedChangeListener
是您必须处理的方法。

搜索“ListView中的按钮”。复选框类似。获取“android已停止工作”当我现在勾选一个复选框时,我不确定我做了什么错事什么是异常,请检查您是否在适配器类中添加了复选框,并正确地找到它的idIt。这是我的xml文件中的一个问题,但现在可以正常工作了,谢谢。我现在遇到的问题是,如果我滚动随机复选框并取消勾选,我想我应该能够研究它很好,如果你没有找到解决方案,那么ping我,我会给你解决方案,但首先搜索并自己找到!!!谢谢,我找到的解决方案是使用public void onick()而不是onCheckedChanged(),但我得到的问题完全相同