如何显示安装的应用程序列表中没有复选框选中获得一个列表视图列表视图时滚动?视图、列表、应用程序、复选框

2023-09-12 00:55:02 作者:再也不见

我的目标是要显示已安装的应用程序列表中的自定义列表视图(在活动的),而不复选框取消选中获得(在列表视图滚动)。

问题:当列表视图滚动时,复选框的选中状态变为取消选中的

我迄今取得的进展: 虽然本博客进入清楚地说明了如何摆脱在列表视图复选框取消选中获得的问题,所不同的是,它使用的型号的是自定义类,而在我的情况下,它是一个系统级的[即所述packageList1 = packageManager.getInstalledPackages(0);]

我该如何解决?下面是我的code尝试。我能够在一个复选框成功listviw显示的应用程序,只是检查状态越来越未选中时,列表视图滚动。

我愿意接受任何方法作为一个答案,使我带你去列出已安装的应用程序在ListView无复选框BECOMING未选中选中的状态

我的自定义Listadapter类的:

 公共类Listadapter扩展了BaseAdapter {

私有静态字符串变量=焦点;
名单< PackageInfo> packageList;
活动范围内;
PackageManager packageManager;
布尔[] itemChecked;

名单<字符串> appNamestoBlock_local;

公共Listadapter(活动背景下,列表与LT; PackageInfo> packageList,
        PackageManager packageManager,列表和LT;字符串> appNamestoBlock){
    超();
    this.context =背景;
    this.packageList = packageList;
    this.packageManager = packageManager;
    this.appNamestoBlock_local = appNamestoBlock;

    itemChecked =新的布尔[packageList.size()];
}

私人字符串getSerializedBlockedAppNames(){
    字符串serializedBlockedAppNames;
    Log.v(TAG,
            --------名单<字符串>列表=
                    + TextUtils.join(,,appNamestoBlock_local));
    serializedBlockedAppNames = TextUtils.join(,,appNamestoBlock_local);
    返回serializedBlockedAppNames;
}

私有类ViewHolder {
    TextView的apkName;
    复选框CK1;
}

公众诠释getCount将(){
    返回packageList.size();
}

公共对象的getItem(INT位置){
    返回packageList.get(位置);
}

众长getItemId(INT位置){
    返回0;
}

@覆盖
公共查看getView(最终诠释的立场,观点convertView,ViewGroup中父){
    最后ViewHolder持有人;

    LayoutInflater充气= context.getLayoutInflater();

    如果(convertView == NULL){
        convertView = inflater.inflate(R.layout.list_item,NULL);
        持有人=新ViewHolder();

        holder.apkName =(TextView中)convertView
                .findViewById(R.id.textView1);
        holder.ck1 =(复选框)convertView.findViewById(R.id.checkBox1);

        holder.ck1.setFocusable(假);
        convertView.setTag(保持器);

    } 其他 {

        支架=(ViewHolder)convertView.getTag();
    }

    PackageInfo packageInfo =(PackageInfo)的getItem(位置);

    可绘制APPICON = packageManager
            .getApplicationIcon(packageInfo.applicationInfo);
    字符串的appName = packageManager.getApplicationLabel(
            packageInfo.applicationInfo)的ToString();
    appIcon.setBounds(0,0,40,40);
    holder.apkName.setCompoundDrawables(APPICON,NULL,NULL,NULL);
    holder.apkName.setCompoundDrawablePadding(15);
    holder.apkName.setText(的appName);
    holder.ck1.setChecked(假);

    如果(itemChecked [位置])
        holder.ck1.setChecked(真正的);
    其他
        holder.ck1.setChecked(假);

    // Log.v(TAG,
    //--------中getView()中ListAdapter检查,如果是的appName在getSerializedBlockedAppNames());
    如果(getSerializedBlockedAppNames()。包含(的appName)){
        Log.v(TAG +ListAdapter
                --------是,appname是在getSerializedBlockedAppNames()的appName =
                        +的appName);
        holder.ck1.setChecked(真正的);
    }

    holder.ck1.setOnCheckedChangeListener(新OnCheckedChangeListener(){

        @覆盖
        公共无效onCheckedChanged(CompoundButton buttonView,
                布尔器isChecked){
            如果(器isChecked){
                itemChecked [位置] =真;
            } 其他 {
                itemChecked [位置] = FALSE;
            }
        }
    });

    返回convertView;

}

}
 

在我的主要活动的onCreate函数的:

  PackageManager packageManager = getPackageManager();
名单< PackageInfo> packageList1 = packageManager.getInstalledPackages(0);

Listadapter适配器=新Listadapter(MainActivityCircularSeekbar.this,packageList1,packageManager,blockedApps);
 
安卓系统的手机,怎么修改软件的权限

解决方案

活动

 进口的java.util.ArrayList;
进口的java.util.List;

进口android.app.Activity;
进口android.content.pm.PackageInfo;
进口android.os.Bundle;
进口android.widget.ListView;

公共类AppScreen延伸活动{
私人的ListView列表;
ArrayList的<数据模型>水库;
MyAdapter _adapter;

@覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.app_screen);

    名单=(ListView控件)findViewById(R.id.list);
    名单< PackageInfo> 。_myapps = getPackageManager()getInstalledPackages(0);
    RES =新的ArrayList<数据模型>();
    的for(int i = 0; I< _myapps.size();我++){
        PackageInfo p值= _myapps.get(ⅰ);

        数据模型_model =新的数据模型();
        (p.applicationInfo.loadLabel(getPackageManager())的toString())_model.setAppname;
        res.add(_model);
        的System.out.println(ajajajja+ res.size()+ res.get(ⅰ).getAppname());
    }
    _adapter =新MyAdapter(getApplicationContext(),RES);
    _adapter.notifyDataSetChanged();
    list.setAdapter(_adapter);


}

}
 

数据模型类

 公共类数据模型{

公共字符串APPNAME =;
选择私人布尔;

公共字符串getAppname(){
    返回应用程序的名字;
}

公共无效setAppname(字符串应用程序的名字){
    this.appname =应用程序的名字;
}

公共布尔isSelected(){
    返回所选择的;
}

公共无效的setSelected(布尔器isChecked){
    this.selected =器isChecked;
}

}
 

适配器类

 公共类MyAdapter扩展了BaseAdapter {
语境_ctx;
LayoutInflater充气;
公众的ArrayList<数据模型>数据;

公共MyAdapter(上下文C,ArrayList的<数据模型> _arraylist){
    this._ctx = C;
    this.data = _arraylist;
}

@覆盖
公众诠释getCount将(){
    返回data.size();
}

@覆盖
公共对象的getItem(INT位置){
    返回的位置;
}

@覆盖
众长getItemId(INT位置){
    返回0;
}

@覆盖
公共查看getView(最终诠释的立场,观点convertView,ViewGroup中父){
    充气=(LayoutInflater)_ctx.getApplicationContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    查看ItemView控件= inflater.inflate(R.layout.inflator,父母,假);
    最后复选框检查=(复选框)itemView.findViewById(R.id.b);
    最后的TextView _setappname =(TextView中)itemView.findViewById(R.id.a);
    checks.setChecked(data.get(位置).isSelected());

    数据模型OBJ = data.get(位置);
    _setappname.setText(obj.getAppname());
    checks.setTag(位置);

    checks.setOnCheckedChangeListener(新OnCheckedChangeListener(){

        @覆盖
        公共无效onCheckedChanged(CompoundButton buttonView,
                布尔器isChecked){
            INT为getPosition =(整数)buttonView.getTag();
            数据模型_OBJ = data.get(为getPosition);
            data.get(位置).setSelected(器isChecked);
            串SS = _obj.getAppname();
            的System.out.println(POS是+为getPosition);

        }
    });

    返回ItemView控件;
}

}
 

活动XML

 <的FrameLayout的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
的xmlns:工具=htt​​p://schemas.android.com/tool​​s
机器人:ID =@ + ID /容器
机器人:layout_width =match_parent
机器人:layout_height =match_parent
工具:上下文=com.installedapps.AppScreen>

<的ListView
    机器人:ID =@ + ID /列表
    机器人:layout_height =FILL_PARENT
    机器人:layout_width =FILL_PARENT>

< / ListView控件>
 

充气XML

 < XML版本=1.0编码=UTF-8&GT?;
< LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
机器人:layout_width =match_parent
机器人:layout_height =60dp
机器人:重力=中心
机器人:layout_gravity =中心
机器人:方向=横向
机器人:weightSum =2>

<的TextView
    机器人:ID =@ + ID /一
    机器人:layout_width =0dp
    机器人:layout_height =FILL_PARENT
    机器人:文字颜色=#000
    机器人:layout_gravity =中心
    机器人:重力=中心
    机器人:layout_weight =1.7/>

<复选框
    机器人:ID =@ + ID / B
    机器人:layout_width =0dp
     机器人:layout_gravity =中心
    机器人:重力=中心
    机器人:layout_weight =0.3
    机器人:layout_height =WRAP_CONTENT/>

< / LinearLayout中>
 

My goal is to display the list of installed apps in a custom listview (within an Activity) without checkbox getting unchecked (when listview is scrolled).

The Problem: When Listview is scrolled, the checked status of the checkbox becomes unchecked.

My Progress So Far: While this blog entry clearly shows how to get rid of the problem of checkboxes in listview getting unchecked, the difference is that it uses Model as the custom class whereas in my case it is a system class [i.e. the packageList1 = packageManager.getInstalledPackages(0);]

How can I resolve this? Below is my code attempt. I am able to successfully display apps in a listviw with checkboxes, just that checked status is getting unchecked when listview is scrolled.

I AM OPEN TO ANY METHOD AS AN ANSWER THAT WILL ENABLE ME TO SHOW LIST OF INSTALLED APPS IN A LISTVIEW WITHOUT THE CHECKED STATUS OF CHECKBOXES BECOMING UNCHECKED

My Custom Listadapter class:

public class Listadapter extends BaseAdapter {

private static String TAG = "focus";
List<PackageInfo> packageList;
Activity context;
PackageManager packageManager;
boolean[] itemChecked;

List<String> appNamestoBlock_local;

public Listadapter(Activity context, List<PackageInfo> packageList,
        PackageManager packageManager, List<String> appNamestoBlock) {
    super();
    this.context = context;
    this.packageList = packageList;
    this.packageManager = packageManager;
    this.appNamestoBlock_local = appNamestoBlock;

    itemChecked = new boolean[packageList.size()];
}

private String getSerializedBlockedAppNames() {
    String serializedBlockedAppNames;
    Log.v(TAG,
            "-------- List<String> list = "
                    + TextUtils.join(",", appNamestoBlock_local));
    serializedBlockedAppNames = TextUtils.join(",", appNamestoBlock_local);
    return serializedBlockedAppNames;
}

private class ViewHolder {
    TextView apkName;
    CheckBox ck1;
}

public int getCount() {
    return packageList.size();
}

public Object getItem(int position) {
    return packageList.get(position);
}

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

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

    LayoutInflater inflater = context.getLayoutInflater();

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.list_item, null);
        holder = new ViewHolder();

        holder.apkName = (TextView) convertView
                .findViewById(R.id.textView1);
        holder.ck1 = (CheckBox) convertView.findViewById(R.id.checkBox1);

        holder.ck1.setFocusable(false);
        convertView.setTag(holder);

    } else {

        holder = (ViewHolder) convertView.getTag();
    }

    PackageInfo packageInfo = (PackageInfo) getItem(position);

    Drawable appIcon = packageManager
            .getApplicationIcon(packageInfo.applicationInfo);
    String appName = packageManager.getApplicationLabel(
            packageInfo.applicationInfo).toString();
    appIcon.setBounds(0, 0, 40, 40);
    holder.apkName.setCompoundDrawables(appIcon, null, null, null);
    holder.apkName.setCompoundDrawablePadding(15);
    holder.apkName.setText(appName);
    holder.ck1.setChecked(false);

    if (itemChecked[position])
        holder.ck1.setChecked(true);
    else
        holder.ck1.setChecked(false);

    // Log.v(TAG,
    // "-------- checking in getView() in ListAdapter if appName is in getSerializedBlockedAppNames()");
    if (getSerializedBlockedAppNames().contains(appName)) {
        Log.v(TAG + " ListAdapter",
                "-------- YES, appName is in getSerializedBlockedAppNames(), appName = "
                        + appName);
        holder.ck1.setChecked(true);
    }

    holder.ck1.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
            if (isChecked) {
                itemChecked[position] = true;
            } else {
                itemChecked[position] = false;
            }
        }
    });

    return convertView;

}

}

In onCreate function of my main activity:

PackageManager packageManager = getPackageManager();
List<PackageInfo> packageList1 = packageManager.getInstalledPackages(0);

Listadapter Adapter = new Listadapter(MainActivityCircularSeekbar.this, packageList1, packageManager, blockedApps);

解决方案

Activity

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.pm.PackageInfo;
import android.os.Bundle;
import android.widget.ListView;

public class AppScreen extends Activity {
private ListView list;
ArrayList<Datamodel> res;
MyAdapter _adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.app_screen);

    list = (ListView) findViewById(R.id.list);
    List<PackageInfo> _myapps = getPackageManager().getInstalledPackages(0);
    res = new ArrayList<Datamodel>();
    for (int i = 0; i < _myapps.size(); i++) {
        PackageInfo p = _myapps.get(i);

        Datamodel _model  = new Datamodel();
        _model.setAppname(p.applicationInfo.loadLabel(getPackageManager()).toString());
        res.add(_model);
        System.out.println("ajajajja" + res.size() + res.get(i).getAppname());
    }
    _adapter = new MyAdapter(getApplicationContext(), res);
    _adapter.notifyDataSetChanged();
    list.setAdapter(_adapter);


}

}

Datamodel class

public class Datamodel {

public String appname = "";
private boolean selected;

public String getAppname() {
    return appname;
}

public void setAppname(String appname) {
    this.appname = appname;
}

public boolean isSelected() {
    return selected;
}

public void setSelected(boolean isChecked) {
    this.selected = isChecked;
}

}

Adapter class

public class MyAdapter extends BaseAdapter {
Context _ctx;
LayoutInflater inflater;
public ArrayList<Datamodel> data;

public MyAdapter(Context c, ArrayList<Datamodel> _arraylist) {
    this._ctx = c;
    this.data = _arraylist;
}

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

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

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

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    inflater = (LayoutInflater) _ctx.getApplicationContext()
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View itemView = inflater.inflate(R.layout.inflator, parent, false);
    final CheckBox checks = (CheckBox) itemView.findViewById(R.id.b);
    final TextView _setappname = (TextView) itemView.findViewById(R.id.a);
    checks.setChecked(data.get(position).isSelected());

    Datamodel obj = data.get(position);
    _setappname.setText(obj.getAppname());
    checks.setTag(position);

    checks.setOnCheckedChangeListener(new OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {                    
            int getPosition = (Integer) buttonView.getTag();
            Datamodel _obj = data.get(getPosition);
            data.get(position).setSelected(isChecked);
            String ss = _obj.getAppname();
            System.out.println("pos is" + getPosition);

        }
    });

    return itemView;
}

}

Activity XML

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.installedapps.AppScreen" >

<ListView 
    android:id="@+id/list"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent">

</ListView>

Inflator xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="60dp"
android:gravity="center"
android:layout_gravity="center"
android:orientation="horizontal"
android:weightSum="2" >

<TextView
    android:id="@+id/a"
    android:layout_width="0dp"
    android:layout_height="fill_parent"
    android:textColor="#000"
    android:layout_gravity="center"
    android:gravity="center"
    android:layout_weight="1.7" />

<CheckBox
    android:id="@+id/b"
    android:layout_width="0dp"
     android:layout_gravity="center"
    android:gravity="center"
    android:layout_weight="0.3"
    android:layout_height="wrap_content" />

</LinearLayout>