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 class 中的接口实现的。该界面还会生成错误 inner classes cannot have static declarations
。
我想知道我是否无法从片段中调用 StartActivity
,因为我的 RecyclerView 适配器或查看器 class 都没有扩展 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;
}
}
任务适配器
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 之外 class。试试下面的方法,看看是否有帮助。
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;
}
}
我的应用使用片段中包含的 RecyclerView 进行编码。我能够使用模拟数据列表成功填充 RecyclerView,但是我不知道如何在单击其中一个项目时将 Intent 发送到另一个 Activity。当我尝试从我的片段中调用 StartActivity
时,Android Studio 无法解析该方法。
我的 onItemClick
是通过我的 viewholder class 中的接口实现的。该界面还会生成错误 inner classes cannot have static declarations
。
我想知道我是否无法从片段中调用 StartActivity
,因为我的 RecyclerView 适配器或查看器 class 都没有扩展 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;
}
}
任务适配器
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 之外 class。试试下面的方法,看看是否有帮助。
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;
}
}