简体   繁体   English

滚动时Listview项的背景选定错误

[英]Listview item's background selected error when scrolling

I have a listview in fragment and my problem is when I select items on listview then it's fine, but when I scroll my listview then item's background is checked for another items, but I don't want that. 我在片段中有一个列表视图,我的问题是当我在列表视图上选择项目时就可以了,但是当我滚动列表视图时,会检查项目背景中是否有其他项目,但我不希望这样。 You can see my image, first I select 3 items (Browser, Calendar, Contact), when I scroll listview then 2 items (Dev tool, Camera) have a changed background, if I continue scroll then listview has more items like that. 您可以看到我的图像,首先我选择3个项目(浏览器,日历,联系人),当我滚动列表视图时,然后2个项目(Dev工具,相机)的背景发生了更改,如果我继续滚动,则列表视图将有更多类似的项目。

在此处输入图片说明 在此处输入图片说明

Here is my code: 这是我的代码:

    @SuppressLint("NewApi") public class Tab2 extends Fragment{
    private PackageManager packageManager = null;
    private List<ApplicationInfo> applist = null;
    public static ApplicationAdapter listadaptor = null;
    public static ListView list;
    private ActionMode acMode;
    private int counterChecked = 0;
    private SparseBooleanArray sp;

    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.tab2test,container,false);
        list = (ListView)v.findViewById(R.id.list_view2);
        list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        list.setItemsCanFocus(false);
        packageManager = getActivity().getPackageManager();
        applist = checkForLaunchIntent(packageManager.getInstalledApplications(PackageManager.GET_META_DATA));
        listadaptor = new ApplicationAdapter(getActivity().getApplicationContext(),R.layout.snippet_list_row, applist);
        list.setAdapter(listadaptor);
        sp = list.getCheckedItemPositions();

        list.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                //Here i set item's color and unselected color
                view.setBackgroundColor(sp.get(position)? 0x9934B5E4: Color.WHITE);
                if(counterChecked<1){
                    acMode = ((AppCompatActivity) getActivity()).startSupportActionMode(mActionModeCallback);
                }
                String str="";
                int i=0;
                for(i=0;i<sp.size();i++)
                {   
                    if(sp.valueAt(i)){
                        str+=sp.keyAt(i)+",";

                    }
                }

                if(list.isItemChecked(position)){
                    Log.d("list1", String.valueOf(position));
                    list.setItemChecked(position, true);
                    counterChecked++;
                }else{
                    list.setItemChecked(position, false);
                    counterChecked--;
                }

                if(counterChecked<1){
                    mActionModeCallback.onDestroyActionMode(acMode);

                }
            }
        });

        return v;
    }
    private List<ApplicationInfo> checkForLaunchIntent(List<ApplicationInfo> list) {
        ArrayList<ApplicationInfo> applist = new ArrayList<ApplicationInfo>();
        for (ApplicationInfo info : list) {
            try {
                if(isSystemPackage(info)){
                    if (null != packageManager.getLaunchIntentForPackage(info.packageName)) {
                        applist.add(info);
                    }                   
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return applist;
    }

    private boolean isSystemPackage(ApplicationInfo AInfo) {
        return ((AInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) ? true
                : false;
    }

    private ActionMode.Callback mActionModeCallback = new ActionMode.Callback(){

        @Override 
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
              MenuInflater inflater = mode.getMenuInflater();
              inflater.inflate(R.menu.cab_menu, menu);
              MainActivity.toolbar.setVisibility(View.GONE);
              return true;
            }

        @Override
        public void onDestroyActionMode(ActionMode mode) {
            mode.finish();
            MainActivity.toolbar.setVisibility(View.VISIBLE);
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {


            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) {
            // TODO Auto-generated method stub
            return false;
        }
    };
}

You actually trigger OnItemClickListener when scrolling which causes a multiple select for items that you didn't want to include. 实际上,您在滚动时会触发OnItemClickListener ,从而导致您不想包含的项目被多项选择。

A better approach would be using a checkBox inside your listView Item and mark the item as selected when the check box is checked: check out this link on how to Get Selected Item Using Checkbox in Listview. 更好的方法是在listView项内使用一个checkBox并在选中该复选框时将其标记为选中状态:请查看此链接,了解如何在Listview中使用复选框获取所选项。

If you incest on using onClick then you can implement longClickListener on your listView Items which may prevent get item selected when scrolling but my advice to you is to go with checkBoxes . 如果您longClickListener于使用onClick则可以在listView Items上实现longClickListener ,这可能会阻止在滚动时选择项目,但是我的建议是使用checkBoxes

OnLongClickListener Implementation: OnLongClickListener实现:

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {

            public boolean onItemLongClick(AdapterView<?> arg0, View v,
                    int index, long arg3) {
                // TODO Auto-generated method stub

                 String str=listView.getItemAtPosition(index).toString();


                return true;
            }
}); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM