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