簡體   English   中英

Android如何在單擊RecyclerView項時從片段發送Intent

[英]Android how to send an Intent from a fragment when a RecyclerView item is clicked

我的應用是使用片段中包含的RecyclerView編碼的。 我能夠用模擬數據列表成功填充RecyclerView,但是當單擊其中一項時,我不知道如何將Intent發送到另一個Activity。 當我嘗試從片段中調用StartActivity ,Android Studio無法解析該方法。

我的onItemClick是通過我的viewholder類中的接口實現的。 接口還會生成錯誤, inner classes cannot have static declarations 我想知道是否無法從片段中調用StartActivity ,因為我的RecyclerView適配器或視圖持有者類都沒有擴展Activity

單擊RecyclerView中的項目時發送Intent的適當實現是什么?

PlaceHolderFragment

public static class PlaceholderFragment extends Fragment {

        Activity mActivity;
        RecyclerView mRecyclerView;
        TaskAdapter taskAdapter;

        public PlaceholderFragment() {
        }

        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            this.mActivity = (Activity) activity;
            setRetainInstance(true);
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {

            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            mRecyclerView = (RecyclerView) rootView.findViewById(R.id.cardList);
            taskAdapter = new TaskAdapter(createList(30));
            return rootView;
        }

        @Override
        public void onViewCreated(View view, Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
            mRecyclerView.setAdapter(taskAdapter);
            mRecyclerView.setHasFixedSize(true);
            mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
            mRecyclerView.setItemAnimator(new DefaultItemAnimator());

            //Cannot resolve method 
            taskAdapter.SetItemClickListener(new TaskAdapter.TaskViewHolder.OnItemClickListener() {

                @Override
                public void onItemClick(View v, int position) {
                    Intent detailIntent = new Intent(v.getContext(), DetailActivity.class);
                    //Cannot resolve method 
                    StartActivity(detailIntent);

                }
            });

        }

        private List<Task> createList(int size) {
            List<Task> result = new ArrayList<>();
            for (int i = 1; i<=size; i++) {
                Task task = new Task();
                task.title = Task.TITLE_PREFIX + i;
                task.updated = Task.UPDATED_PREFIX +i;
                task.notes = task.NOTES_PREFIX + i;

                result.add(task);

            }
            return result;
        }
    }

TaskAdapter

public class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.TaskViewHolder> {

    private List<Task> taskList;
    TaskViewHolder.OnItemClickListener mItemClickListener;

    public TaskAdapter(List<Task> taskList) {
        this.taskList = taskList;
    }

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

    @Override
    public void onBindViewHolder(TaskViewHolder taskViewHolder, int i) {
        Task task = taskList.get(i);
        taskViewHolder.mTitle.setText(task.title);
        taskViewHolder.mUpdated.setText(task.updated);
        taskViewHolder.mStatus.setChecked(false);
    }

    @Override
    public TaskViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {

        View itemView = LayoutInflater.from(viewGroup.getContext()).
                inflate(R.layout.tasklist_layout, viewGroup, false);

        return new TaskViewHolder(itemView);
    }

    public class TaskViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        protected TextView mTitle;
        protected TextView mUpdated;
        protected CheckBox mStatus;

        public TaskViewHolder(View view) {
            super(view);
            mTitle = (TextView) view.findViewById(R.id.title);
            mUpdated = (TextView) view.findViewById(R.id.updated);
            mStatus = (CheckBox) view.findViewById(R.id.status);
            view.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if (mItemClickListener != null) {
                mItemClickListener.onItemClick(v, getPosition());
            }
        }
        //Inner Classes cannot have static declarations
        public interface OnItemClickListener {
            void onItemClick(View view , int position);
        }

        public void SetOnItemClickListener(final OnItemClickListener mItemClickListener) {
            //cannot resolve symbol 
            this.mItemClickListener = mItemClickListener;
        }
    }
}

startActivity()方法以s開頭。 嘗試下面的代碼行

   //Cannot resolve method 
        taskAdapter.TaskViewHolder.SetItemClickListener(new TaskAdapter.TaskViewHolder.OnItemClickListener() {

            @Override
            public void onItemClick(View v, int position) {
                Intent detailIntent = new Intent(v.getContext(), DetailActivity.class);
                //Cannot resolve method 
                getActivity().startActivity(detailIntent);

            }
        });

SetOnItemClickListener()應該在TaskViewHolder類之外。 請嘗試以下方法,看看是否有幫助。

public class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.TaskViewHolder> {

private List<Task> taskList;
TaskViewHolder.OnItemClickListener mItemClickListener;

public TaskAdapter(List<Task> taskList) {
    this.taskList = taskList;
}

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

@Override
public void onBindViewHolder(TaskViewHolder taskViewHolder, int i) {
    Task task = taskList.get(i);
    taskViewHolder.mTitle.setText(task.title);
    taskViewHolder.mUpdated.setText(task.updated);
    taskViewHolder.mStatus.setChecked(false);
}

@Override
public TaskViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {

    View itemView = LayoutInflater.from(viewGroup.getContext()).
            inflate(R.layout.tasklist_layout, viewGroup, false);

    return new TaskViewHolder(itemView);
}

public class TaskViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    protected TextView mTitle;
    protected TextView mUpdated;
    protected CheckBox mStatus;

    public TaskViewHolder(View view) {
        super(view);
        mTitle = (TextView) view.findViewById(R.id.title);
        mUpdated = (TextView) view.findViewById(R.id.updated);
        mStatus = (CheckBox) view.findViewById(R.id.status);
        view.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (mItemClickListener != null) {
            mItemClickListener.onItemClick(v, getPosition());
        }
    }
    //Inner Classes cannot have static declarations
    public interface OnItemClickListener {
        void onItemClick(View view , int position);
    }
}

 public void SetOnItemClickListener(final OnItemClickListener mItemClickListener) {
        //cannot resolve symbol 
        this.mItemClickListener = mItemClickListener;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM