如何获取单击的选中按钮的视图位置以及如何根据其位置将其设置为选中状态

Posted

技术标签:

【中文标题】如何获取单击的选中按钮的视图位置以及如何根据其位置将其设置为选中状态【英文标题】:How do I get the view position of a clicked checkedbutton and how to set it checked based on it's position 【发布时间】:2022-01-17 08:12:29 【问题描述】:

我在尝试解决一个错误时被卡住了 2 天 与我的应用程序中显示的复选框。我创建了一个活动,显示已安装应用程序的列表,每个显示的应用程序旁边都有复选框。当我单击特定应用程序的复选框时,例如 Facebook,其他一些应用程序的复选框会被标记,而不会被单击。我不知道为什么会这样,如果你能帮助我,我将不胜感激:D。我使用了带有数组适配器的列表视图来显示已安装应用程序的列表。

阵列适配器

public class ListofAppsAdapter extends ArrayAdapter<ApplicationInfo> 

private List<ApplicationInfo> applicationInfoList;
private Context context;
private PackageManager packageManager;
private int x = 0;

SparseBooleanArray mCheckStates;


public ListofAppsAdapter(@NonNull Context context, int resource, @NonNull List<ApplicationInfo> objects) 
    super(context, resource, objects);
    this.context = context;
    this.applicationInfoList = objects;
    packageManager = context.getPackageManager();
    mCheckStates = new SparseBooleanArray(applicationInfoList.size());


@Override
public int getCount() 
    return ((null != applicationInfoList) ? applicationInfoList.size() : 0);


@Nullable
@Override
public ApplicationInfo getItem(int position) 
    return ((null != applicationInfoList) ? applicationInfoList.get(position) : null);


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


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

      if (view == null) 
        LayoutInflater layoutInflater = (LayoutInflater) 
     context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = layoutInflater.inflate(R.layout.listsofapps_layout, null);
      

      ApplicationInfo data = applicationInfoList.get(position);

      if (data != null) 
        ImageView app_logo = view.findViewById(R.id.appicon);
        CheckBox checkBox = view.findViewById(R.id.add_app);
        app_logo.setImageDrawable(data.loadIcon(packageManager));
     //                add_app.setText(appDetailsList.get(position).name);

        checkBox.setText(data.loadLabel(packageManager));
      


     //
     //        view.setOnClickListener(new View.OnClickListener() 
     //            @Override
     //            public void onClick(View view) 
     //
     //                Toast.makeText(context, "Clicked JIMMY", Toast.LENGTH_SHORT).show();
     //
     //                if (x == 4 && !add_app.isChecked()) 
     //                    Toast.makeText(context, "You reached your limit", Toast.LENGTH_SHORT).show();
     //                    add_app.setChecked(false);
     //                    return;
     //                
     //
     //                if (!add_app.isChecked()) 
     //                    x++;
     //                    add_app.setChecked(true);
     //                    return;
     //                
     //
     //                if (add_app.isChecked()) 
     //                    x--;
     //                    add_app.setChecked(false);
     //                    return;
     //                
     //
     //               
     //
     //             );

            return view;
         

     

活动

public class SelectAppsActivity extends ListActivity 

private PackageManager packageManager = null;
private List<ApplicationInfo> applist = null;
private ListofAppsAdapter listofAppsAdapter = null;

RelativeLayout goBackappsHolder, proceedappsHolder;
ListView listsofappsrecyclerview;

CharSequence packageName, app_Name;
Drawable icon;

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

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
        getWindow().setNavigationBarColor(getResources().getColor(R.color.darkTheme));
    


    goBackappsHolder = findViewById(R.id.goBackappsHolder);
    proceedappsHolder = findViewById(R.id.proceedappsHolder);

    packageManager = getPackageManager();

    new loadApps().execute();



@Override
protected void onListItemClick(ListView l, View v, int position, long id) 
    super.onListItemClick(l, v, position, id);
    try 

     catch (ActivityNotFoundException e) 
        Toast.makeText(SelectAppsActivity.this, "" + e.getMessage(), Toast.LENGTH_SHORT).show();
     catch (Exception e) 
        Toast.makeText(SelectAppsActivity.this, "" + e.getMessage(), Toast.LENGTH_SHORT).show();
    


private List<ApplicationInfo> checkForLaunchIntent(List<ApplicationInfo> installedApplications) 

    ArrayList<ApplicationInfo> appList = new ArrayList<ApplicationInfo>();

    for (ApplicationInfo info : installedApplications) 

        try 
            if (packageManager.getLaunchIntentForPackage(info.packageName) != null) 
                appList.add(info);
            
         catch (Exception e) 
            e.printStackTrace();
        
    

    return appList;



private class loadApps extends AsyncTask<Void, Void, Void> 

    private ProgressDialog progressDialog = null;

    @Override
    protected Void doInBackground(Void... voids) 

        applist = checkForLaunchIntent(packageManager.getInstalledApplications(PackageManager.GET_META_DATA));
        listofAppsAdapter = new ListofAppsAdapter(SelectAppsActivity.this, R.layout.listsofapps_layout, applist);
        return null;
    

    @Override
    protected void onPostExecute(Void unused) 
        setListAdapter(listofAppsAdapter);
        progressDialog.dismiss();
        super.onPostExecute(unused);
    

   @Override
   protected void onPreExecute() 
   progressDialog = ProgressDialog.show(SelectAppsActivity.this, null, "Loading app info...");
   super.onPreExecute();
     
    

  

【问题讨论】:

请出示一段可复现的简短代码,否则只能猜测。 我已经发布了更新。如果可以,请提供帮助。 与其尝试为 View 容器创建点击监听器,不如在创建复选框的同时为复选框本身动态添加点击监听器,这样就可以了永远不能误选其他复选框。 在您注释掉的代码中,add_app 指的是什么?使用add_app.setChecked(true); 时需要引用正确的复选框,因为听起来您从未更改过add_app 的值,因此任何点击事件都只会选中该复选框。 只需引用正确的复选框,例如theCorrectCheckBox.setChecked(true);,它会将正确的复选框设置为选中。我不会为你做你的工作,你没有在你的问题中显示足够的代码来弄清楚发生了什么,所以我不知道你是如何在 ListView 中创建或管理你的复选框并且无法提供简单的修复.您通常会有某种方式直接引用正确的复选框,或者您将拥有一个复选框列表,并使用所选项目的int 值从列表中获取正确的复选框并进行检查。跨度> 【参考方案1】:

我现在知道如何解决它了。覆盖以下方法。

@Override
public int getViewTypeCount() 
    return getCount();


@Override
public int getItemViewType(int position) 
    return position;

【讨论】:

以上是关于如何获取单击的选中按钮的视图位置以及如何根据其位置将其设置为选中状态的主要内容,如果未能解决你的问题,请参考以下文章

单击单元格按钮时如何显示视图

如何在 Access 2007 的窗体中实现点击按钮打开另一个窗体???

如何获取地理位置然后自动提交表单而无需单击按钮

如何根据位置从“回收”视图中删除Firebase数据库密钥

如何从其适配器中更改回收视图的项目位置?

如何从 UIScrollView 获取 UIButton 位置