Методы setClickable () и setEnabled () не работают - PullRequest
0 голосов
/ 20 апреля 2020

setClickable () и setEnabled () не работают, но другие методы, такие как setVisibilty (), работают очень хорошо, поэтому при запуске действия в режиме действия представление рециркулятора должно быть отключено и недоступно для нажатия. я искал в Интернете решения, но ничто из них не помогло мне

класс фрагмента

public class MemoryFragment extends Fragment {
public static ListView listView;
private AbsListView.MultiChoiceModeListener multiChoiceModeListener;
public static List<Folders> foldersList = new ArrayList<>();
public static ListViewBaseAdapter listViewBaseAdapter;
public static File rootDirectory = Environment.getExternalStorageDirectory();

String[] permissions = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
final int permission_code = 100;

    public static List<String> recyclerList = new ArrayList<>();
    public static RecyclerView recyclerView;
    public static RecyclerViewAdapter recyclerViewAdapter;

    public static boolean isActionMode = false;
    public static List<String> selectedFolders = new ArrayList<>();
    public static ActionMode actionMode = null;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {
            if(recyclerList != null){
                recyclerList.clear();
                recyclerViewAdapter.notifyDataSetChanged();
            }

            if(listViewBaseAdapter != null) {
                listViewBaseAdapter.clear();
                listViewBaseAdapter.notifyDataSetChanged();
            }
        }catch (NullPointerException e){

        }
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = getLayoutInflater().inflate(R.layout.fragment_memory, container, false);

        recyclerView = view.findViewById(R.id.recycler_view);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(layoutManager);

        recyclerList.add(rootDirectory.getAbsolutePath());

        recyclerViewAdapter = new RecyclerViewAdapter(recyclerList);
        recyclerView.setAdapter(recyclerViewAdapter);

        for(int x = 0; x < permissions.length; x++)
            checkPermissions(permissions, permission_code);

        String[] rootNames = rootDirectory.list();
        File[] files = rootDirectory.listFiles();
        for (int x = 0; x < files.length; x++) {
            if (files[x].isDirectory())
                foldersList.add(new Folders(R.drawable.ic_folders, rootNames[x], files[x]));
            else
                foldersList.add(new Folders(R.drawable.ic_file, rootNames[x], files[x]));
        }

        listViewBaseAdapter = new ListViewBaseAdapter(getContext(), foldersList);

        listView = view.findViewById(R.id.list_view);
        listView.setAdapter(listViewBaseAdapter);
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Folders folder = foldersList.get(position);
                String fileName = folder.getFile().getName();
                recyclerList.add(fileName);
                Folders.newFolders(position, foldersList, listViewBaseAdapter, recyclerViewAdapter);
            }
        });

        multiChoiceModeListener = new AbsListView.MultiChoiceModeListener() {
            @Override
            public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {

            }

            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                MenuInflater menuInflater = mode.getMenuInflater();
                menuInflater.inflate(R.menu.list_item_menu, menu);
                isActionMode = true;
                actionMode = mode;
                recyclerView.setEnabled(false);            //here is the problem 1
                recyclerView.setClickable(false);          //here is the problem 2
                return true;
            }

            @Override
            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {

                return false;
            }

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

                return false;
            }

            @Override
            public void onDestroyActionMode(ActionMode mode) {
                isActionMode = false;
                actionMode = null;
                selectedFolders.clear();
                ListViewBaseAdapter.checkStates.clear();
            }
        };
        listView.setMultiChoiceModeListener(multiChoiceModeListener);

        return view;
    }


    public void checkPermissions(String[] permissions, int permission_code){
        if (ContextCompat.checkSelfPermission(this.getContext(), permissions[0]) == PackageManager.PERMISSION_DENIED ||
                ContextCompat.checkSelfPermission(this.getContext(), permissions[1]) == PackageManager.PERMISSION_DENIED)
            requestPermissions(this.getActivity(), permissions, permission_code);
        else
            return;
    }

    public void requestPermissions(Activity activity, String[] permissions, int requestCode){
        for (int x = 0; x < permissions.length; x++)
            ActivityCompat.requestPermissions(activity, permissions, requestCode);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case permission_code: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0 && grantResults[0] + grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                    // permission was granted, yay! Do the
                    // contacts-related task you need to do.
                } else {
                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                }
                return;
            }

            // other 'case' lines to check for other
            // permissions this app might request.
        }
    }
}

класс адаптера рециркулятора

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
private List<String> folderNames;


public RecyclerViewAdapter(List folderNames){
    this.folderNames = folderNames;

}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view_adapter, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
    holder.imageView.setImageResource(R.drawable.ic_arrow);
    holder.textView.setText(folderNames.get(position));
    holder.textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(folderNames.get(0).equals(SDCardFragment.path))
                Folders.backToFolder(position, SDCardFragment.recyclerList, SDCardFragment.listViewBaseAdapter, RecyclerViewAdapter.this);
            else
                Folders.backToFolder(position, MemoryFragment.recyclerList, MemoryFragment.listViewBaseAdapter, RecyclerViewAdapter.this);
        }
    });
}

@Override
public int getItemCount() {
    return folderNames.size();
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public static class ViewHolder extends RecyclerView.ViewHolder {
    ImageView imageView;
    TextView textView;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        imageView = itemView.findViewById(R.id.image_view);
        textView = itemView.findViewById(R.id.text);
    }
}
}

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020
 @Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
    holder.imageView.setImageResource(R.drawable.ic_arrow);

    if(MemoryFragment.isActionMode)
        holder.textView.setEnabled(false);
    else
        holder.textView.setEnabled(true);

    holder.textView.setText(folderNames.get(position));
    holder.textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(folderNames.get(0).equals(SDCardFragment.path))
                Folders.backToFolder(position, SDCardFragment.recyclerList, SDCardFragment.listViewBaseAdapter, RecyclerViewAdapter.this);
            else
                Folders.backToFolder(position, MemoryFragment.recyclerList, MemoryFragment.listViewBaseAdapter, RecyclerViewAdapter.this);
        }
    });


@Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            MenuInflater menuInflater = mode.getMenuInflater();
            menuInflater.inflate(R.menu.list_item_menu, menu);
            isActionMode = true;
            actionMode = mode;
            recyclerViewAdapter.notifyDataSetChanged();
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {

            return false;
        }

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

            return false;
        }

        @Override
        public void onDestroyActionMode(ActionMode mode) {
            isActionMode = false;
            actionMode = null;
            selectedFolders.clear();
            ListViewBaseAdapter.checkStates.clear();
            recyclerViewAdapter.notifyDataSetChanged();
        }

Проще говоря, я использовал переменную isActionsMode в качестве индикатора для переработчика textView.setEnabled(), а затем применил recyclerViewAdapter.notifyDataSetChanged() в режиме создания и уничтожения действий.

0 голосов
/ 20 апреля 2020

То, что вы делаете, неправильно. Вы просите реселлер-обзор отключить клики, которые нам не нравятся. RecyclerView, так как каждый элемент имеет свой собственный приемник щелчков, который вы обрабатываете уже в методе onItemClick.

Если вы хотите отключить щелчки или прикосновения для дочерних элементов RecyclerView, то вы можете просто взять глобальную переменную, скажем: private boolean isclickAllowed = true

Затем в свой itemClickListener добавьте эту проверку

if(isclickAllowed) {
// your code here
}

Затем, когда вы захотите отключить прослушиватель Click, просто измените эту переменную на "false"

Как и в вашем случае, когда в ActionMode измените эту переменную на «false»

А когда вы хотите включить возврат назад, просто измените значение на «true».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...