Android Can';t使用其中的appcompat元素创建自定义arrayadapter

Android Can';t使用其中的appcompat元素创建自定义arrayadapter,android,android-arrayadapter,android-appcompat,Android,Android Arrayadapter,Android Appcompat,我制作了一个适配器,它扩展了ArrayAdapter,以创建自定义项列表。这些项目有一个可绘图、一个文本视图,最后是一个AppCompatCheckBox 不幸的是,AppCompatCheckBoxcompontents无法呈现。当我将AppCompatCheckBox更改为CheckBox时,效果很好。我在活动的另一个部分添加了一个AppCompatCheckBox,它工作得很好,只有在适配器中才有问题 代码示例如下: 客户项目: import android.graphics.drawab

我制作了一个适配器,它扩展了
ArrayAdapter
,以创建自定义项列表。这些项目有一个可绘图、一个文本视图,最后是一个
AppCompatCheckBox

不幸的是,
AppCompatCheckBox
compontents无法呈现。当我将
AppCompatCheckBox
更改为
CheckBox
时,效果很好。我在活动的另一个部分添加了一个
AppCompatCheckBox
,它工作得很好,只有在适配器中才有问题

代码示例如下:

客户项目:

import android.graphics.drawable.Drawable;

public class PackageListItem {

    private Boolean enabledState;
    private String packageName;
    private Drawable packageIcon;

    public PackageListItem(Boolean enabledState, String packageName, Drawable packageIcon){
        this.enabledState = enabledState;
        this.packageName = packageName;
        this.packageIcon = packageIcon;
    }

    public boolean getPackageEnabled(){
        return enabledState;
    }

    public Drawable getPackageIcon(){
        return packageIcon;
    }

    public String getPackageName(){
        return packageName;
    }

    public void setPackageEnabled(Boolean enabledState){
        this.enabledState = enabledState;
    }

    public void setPackageIcon(Drawable packageIcon){
        this.packageIcon = packageIcon;
    }

    public void setPackageName(String packageName){
        this.packageName = packageName;
    }
}
自定义适配器:

import android.content.Context;
import android.support.v7.widget.AppCompatCheckBox;
import android.support.v7.widget.SwitchCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.Switch;
import android.widget.TextView;

import java.util.ArrayList;


public class PackageListAdapter extends ArrayAdapter<PackageListItem> {


    public PackageListAdapter(Context context, ArrayList<PackageListItem> packages){
        super(context, 0, packages);
    }

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

        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.package_item, parent, false);
        }

        TextView tvPackageName = (TextView) convertView.findViewById(R.id.packageName);
        ImageView ivPackageIcon = (ImageView) convertView.findViewById(R.id.packageIcon);
        CheckBox sPackageSwitch = (CheckBox) convertView.findViewById(R.id.packageEnabled);

        tvPackageName.setText(packageItem.getPackageName());
        ivPackageIcon.setImageDrawable(packageItem.getPackageIcon());
        sPackageSwitch.setChecked(packageItem.getPackageEnabled());

        return convertView;
    }
}
导入android.content.Context;
导入android.support.v7.widget.AppCompatCheckBox;
导入android.support.v7.widget.SwitchCompat;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.CheckBox;
导入android.widget.ImageView;
导入android.widget.Switch;
导入android.widget.TextView;
导入java.util.ArrayList;
公共类PackageListAdapter扩展了ArrayAdapter{
公共PackageListAdapter(上下文上下文,ArrayList包){
超级(上下文,0,包);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
PackageListItem packageItem=getItem(位置);
if(convertView==null){
convertView=LayoutInflater.from(getContext()).flate(R.layout.package_项,父项,false);
}
TextView tPackageName=(TextView)convertView.findViewById(R.id.packageName);
ImageView ivPackageIcon=(ImageView)convertView.findViewById(R.id.packageIcon);
复选框sPackageSwitch=(复选框)convertView.findViewById(R.id.packageEnabled);
tvPackageName.setText(packageItem.getPackageName());
ivPackageIcon.setImageDrawable(packageItem.getPackageIcon());
setChecked(packageItem.getPackageEnabled());
返回视图;
}
}
自定义项XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">
    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1">
        <ImageView
            android:id="@+id/packageIcon"
            android:layout_width="40dp"
            android:layout_height="40dp" />
        <TextView
            android:id="@+id/packageName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="@style/AppTheme.ListTitle"/>
    </LinearLayout>
    <CheckBox
        android:id="@+id/packageEnabled"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

我正在初始化列表:

 private void initPackagesList(){
        ArrayList<PackageListItem> arrayListOfPackages = new ArrayList<>();

        PackageManager pm = getPackageManager();
        List<ResolveInfo> apps = pm.queryIntentActivities(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER), 0);

        for(ResolveInfo apInfo : apps){
            String packageName = apInfo.loadLabel(pm).toString();
            Drawable packageIcon = apInfo.loadIcon(pm);
            boolean packageState = myPreferences.getBoolean(packageName, false);

            Log.d("MainActivity","" + packageName);

            PackageListItem item = new PackageListItem(packageState, packageName, packageIcon);

            arrayListOfPackages.add(item);
        }

        PackageListAdapter adapter = new PackageListAdapter(getApplicationContext(),arrayListOfPackages);
        ListView listView = (ListView) findViewById(R.id.packages_listview);
        listView.setAdapter(adapter);
    }
private void initPackagesList(){
ArrayList ArrayListOffpackages=新的ArrayList();
PackageManager pm=getPackageManager();
列表应用程序=pm.querytentActivities(新意图(意图.ACTION\u MAIN).添加类别(意图.CATEGORY\u启动器),0);
用于(ResolveInfo apInfo:apps){
字符串packageName=apInfo.loadLabel(pm.toString();
可抽出包装图标=apInfo.loadIcon(pm);
boolean packageState=myPreferences.getBoolean(packageName,false);
Log.d(“MainActivity”,即“+packageName”);
PackageListItem项目=新的PackageListItem(packageState、packageName、packageIcon);
arrayListOfPackages.add(项目);
}
PackageListAdapter=新的PackageListAdapter(getApplicationContext(),arrayListOfPackages);
ListView ListView=(ListView)findViewById(R.id.packages\u ListView);
setAdapter(适配器);
}
结果是:


您的问题在于初始化适配器的方式

要解决您的问题,请更换新的PackageListAdapter(getApplicationContext(),arrayListOfPackages)带有
新的PackageListAdapter(此为arrayListOfPackages)。(或
getActivity()
如果在片段中)

如果我错了,请纠正我,但我相信AppCompat库依赖于设置大多数视图的样式。使用
getApplicationContext()
将基本应用程序上下文传递给ListView适配器,从而绕过AppCompat。传递
this
getActivity()
将传递顶部上下文,该上下文可以告诉LayoutFlater应用其他样式。如果没有它,适配器的LayoutFlater将使用默认样式


当然,您的活动也应该扩展,但我想您已经知道了。

您确定复选框没有渲染吗?空间被占用,所以元素存在。也许是白色的?您是否尝试使用不同的背景色?关于文档中的
AppCompatCheckbox
-当您在版面中使用
CheckBox
时,将自动使用此选项。编写自定义视图时,应该只需要手动使用此类。。适配器不是自定义视图(组件)。我知道它们不会呈现,因为我无法与它们交互,而且它们也不是白色的。还有Damian,我正在创建一个自定义视图组件。它是由自定义视图组成的适配器。另外,如果我不使用appcompat复选框,那么它们的样式将类似于旧设备上的冰淇淋三明治复选框,这是我想要避免的