簡體   English   中英

滾動時Listview項的背景選定錯誤

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

我在片段中有一個列表視圖,我的問題是當我在列表視圖上選擇項目時就可以了,但是當我滾動列表視圖時,會檢查項目背景中是否有其他項目,但我不希望這樣。 您可以看到我的圖像,首先我選擇3個項目(瀏覽器,日歷,聯系人),當我滾動列表視圖時,然后2個項目(Dev工具,相機)的背景發生了更改,如果我繼續滾動,則列表視圖將有更多類似的項目。

在此處輸入圖片說明 在此處輸入圖片說明

這是我的代碼:

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

實際上,您在滾動時會觸發OnItemClickListener ,從而導致您不想包含的項目被多項選擇。

更好的方法是在listView項內使用一個checkBox並在選中該復選框時將其標記為選中狀態:請查看此鏈接,了解如何在Listview中使用復選框獲取所選項。

如果您longClickListener於使用onClick則可以在listView Items上實現longClickListener ,這可能會阻止在滾動時選擇項目,但是我的建議是使用checkBoxes

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