简体   繁体   中英

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.

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

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.

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.

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 .

OnLongClickListener Implementation:

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;
            }
}); 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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