子 RecyclerView setadapter 在我的嵌套 RecyclerView 上不起作用 Android
Child RecyclerView setadapter doesn't work on my Nested RecyclerView Android
我有两个 RecyclerView。 Parent RecyclerView 工作完美,但父适配器中子项的 setadapter 不工作。
我试图在子适配器中创建一些日志消息,但它们甚至没有出现,因此适配器甚至没有启动
为了更好的理解,下面是一段代码。
MainFragment.java
// Set up the RecyclerView.
recyclerview = rootView.findViewById(R.id.recycler_view);
adapter = new TodayAdapter(getContext());
recyclerview.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerview.setAdapter(adapter);
taskViewModel = new ViewModelProvider(requireActivity()).get(TaskViewModel.class);
List<TaskList> categories = new ArrayList<>();
TaskList completedTasks = new TaskList("Completed Tasks",null);
TaskList incompletedTasks = new TaskList("Incompleted Tasks",null);
List<Task> intask = new ArrayList<>();
List<Task> comtask = new ArrayList<>();
// Update the cached copy of the words in the adapter.
// Get all the words from the database
// and associate them to the adapter.
taskViewModel.getAllTasks().observe( getActivity(), new Observer<List<Task>>() {
@Override
public void onChanged(List<Task> tasks) {
for(Task task : tasks){
if(task.getState().equals("0")) {
intask.add(task);
incompletedTasks.setTasks(intask);
} else{
comtask.add(task);
completedTasks.setTasks(comtask);
}
}
categories.add(incompletedTasks);
categories.add(completedTasks);
adapter.setCategory(categories);
}
});
ParentAdapter.java
public class TodayAdapter extends RecyclerView.Adapter<TodayAdapter.TodayHolder>{
private List<TaskList> categories;
public TodayAdapter(List<TaskList> todayLists) {
this.categories = todayLists;
}
public TodayAdapter(Context context) {
LayoutInflater mInflater = LayoutInflater.from(context);
}
@NonNull
@Override
public TodayHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
return new TodayAdapter.TodayHolder(itemView); }
@SuppressLint("NotifyDataSetChanged")
@Override
public void onBindViewHolder(@NonNull TodayHolder holder, int position) {
Log.d("test", Integer.toString(categories.size()));
if(categories!=null) {
TaskList category = categories.get(position);
holder.title.setText(category.getTitle());
holder.tasks.setHasFixedSize(true);
TaskAdapter taskAdapter = new TaskAdapter();
taskAdapter.setTasks(category.getTasks());
holder.tasks.setAdapter(taskAdapter);
taskAdapter.notifyDataSetChanged();
}
}
@Override
public int getItemCount() {
if(categories!=null)
return categories.size();
return 0;
}
public class TodayHolder extends RecyclerView.ViewHolder {
private TextView title;
private RecyclerView tasks;
public TodayHolder(@NonNull View itemView) {
super(itemView);
title=itemView.findViewById(R.id.title);
tasks=itemView.findViewById(R.id.tasks);
}
}
//Associates a list of tasks with this adapter
public void setCategory(List<TaskList> categories) {
this.categories = categories;
notifyDataSetChanged();
}
}
ChildAdapter.java
/**
* Adapter for the RecyclerView that displays a list of words.
*/
public class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.TaskHolder> {
private List<Task> tasks; // Cached copy of words
private OnItemClickListener listener;
public TaskAdapter(Context context) {
LayoutInflater mInflater = LayoutInflater.from(context);
}
public TaskAdapter() {
}
@NonNull
@Override
public TaskHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Log.d("test","rani fe task adapder");
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.task_item, parent, false);
return new TaskHolder(itemView);
}
@SuppressLint("ResourceAsColor")
@Override
public void onBindViewHolder(@NonNull TaskHolder holder, int position) {
Log.d("test","we are in =" +position);
if (tasks != null) {
Task currentTask = tasks.get(position);
holder.textViewTitle.setText(currentTask.getTitle());
holder.textViewDescription.setText(currentTask.getDescription());
switch (currentTask.getCategory()) {
case "1":
holder.layout.setBackgroundResource(R.color.button_beige);
if (currentTask.getState().equals("0")){
holder.view.setBackgroundResource(R.drawable.uncheck_beige);
holder.textViewTitle.setPaintFlags(0);
holder.textViewDescription.setPaintFlags(0);
}else{
holder.view.setBackgroundResource(R.drawable.check_beige);
holder.textViewTitle.setPaintFlags(holder.textViewTitle.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
holder.textViewDescription.setPaintFlags(holder.textViewDescription.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
}
break;
case "2":
holder.layout.setBackgroundResource(R.color.button_blue);
if(currentTask.getState().equals("0")){
holder.view.setBackgroundResource(R.drawable.uncheck_blue);
holder.textViewTitle.setPaintFlags(0);
holder.textViewDescription.setPaintFlags(0);
}
else{
holder.view.setBackgroundResource(R.drawable.check_blue);
holder.textViewTitle.setPaintFlags(holder.textViewTitle.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
holder.textViewDescription.setPaintFlags(holder.textViewDescription.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
}
break;
case "3":
holder.layout.setBackgroundResource(R.color.button_green);
if(currentTask.getState().equals("0")){
holder.view.setBackgroundResource(R.drawable.uncheck_green);
holder.textViewTitle.setPaintFlags(0);
holder.textViewDescription.setPaintFlags(0);
}
else{
holder.view.setBackgroundResource(R.drawable.check_green);
holder.textViewTitle.setPaintFlags(holder.textViewTitle.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
holder.textViewDescription.setPaintFlags(holder.textViewDescription.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
} break;
case "4":
holder.layout.setBackgroundResource(R.color.button_pink);
if(currentTask.getState().equals("0")){
holder.view.setBackgroundResource(R.drawable.uncheck_pink);
holder.textViewTitle.setPaintFlags(0);
holder.textViewDescription.setPaintFlags(0);
}
else{
holder.view.setBackgroundResource(R.drawable.check_pink);
holder.textViewTitle.setPaintFlags(holder.textViewTitle.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
holder.textViewDescription.setPaintFlags(holder.textViewDescription.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
}
break;
case "5":
holder.layout.setBackgroundResource(R.color.button_purple);
if(currentTask.getState().equals("0")){
holder.view.setBackgroundResource(R.drawable.uncheck_purple);
holder.textViewTitle.setPaintFlags(0);
holder.textViewDescription.setPaintFlags(0);
}
else{
holder.view.setBackgroundResource(R.drawable.check_purple);
holder.textViewTitle.setPaintFlags(holder.textViewTitle.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
holder.textViewDescription.setPaintFlags(holder.textViewDescription.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
}
break;
default:
holder.layout.setBackgroundResource(R.color.black);
if(currentTask.getState().equals("0")){
holder.view.setBackgroundResource(R.drawable.uncheck_black);
holder.textViewTitle.setPaintFlags(0);
holder.textViewDescription.setPaintFlags(0);
}
else{
holder.view.setBackgroundResource(R.drawable.check_black);
holder.textViewTitle.setPaintFlags(holder.textViewTitle.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
holder.textViewDescription.setPaintFlags(holder.textViewDescription.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
}
break;
}
}
}
//getItemCount() is called many times, and when it is first called,
//mWords has not been updated (means initially, it's null, and we can't return null).
@Override
public int getItemCount() {
if (tasks != null)
return tasks.size();
return 0;
}
//Associates a list of tasks with this adapter
public void setTasks(List<Task> tasks) {
this.tasks = tasks;
notifyDataSetChanged();
if(tasks != null){
Log.d("test","task size =" +this.tasks.size());
}else Log.d("test","task size =" +0);
}
//to get the item from the id
public Task getTaskAt(int position) {
return tasks.get(position);
}
class TaskHolder extends RecyclerView.ViewHolder {
private TextView textViewTitle;
private TextView textViewDescription;
private View view;
private LinearLayout layout;
private RelativeLayout EditLayout;
public TaskHolder(@NonNull View itemView) {
super(itemView);
textViewTitle = itemView.findViewById(R.id.text_view_title);
textViewDescription = itemView.findViewById(R.id.text_view_description);
layout = itemView.findViewById(R.id.color);
view = itemView.findViewById(R.id.image);
EditLayout = itemView.findViewById(R.id.EditLayout);
EditLayout.setOnClickListener(v -> {
int position = getAdapterPosition();
listener.onItemClick(tasks.get(position));
});
view.setOnClickListener(v -> {
int position = getAdapterPosition();
listener.onDoneClick(tasks.get(position));
});
}
}
public interface OnItemClickListener {
void onItemClick(Task task);
void onDoneClick(Task task);
}
public void setOnItemClickListener(OnItemClickListener listener) {
this.listener = listener;
}
}
这是因为您必须先预取子项,然后再使用以下方法创建其适配器:
layoutManager.setInitialPrefetchItemCount(parentItem, .size());
你可以在这里找到完整的教程
https://www.geeksforgeeks.org/how-to-create-a-nested-recyclerview-in-android/
我通过像这样添加线性布局管理器来修复它
holder.tasks.setHasFixedSize(true);
ChildAdapter childAdapter = new ChildAdapter();
childAdapter.setList(category.getLists());
LinearLayoutManager layoutManager = new LinearLayoutManager(mContext);
holder.tasks.setLayoutManager(layoutManager);
holder.tasks.setAdapter(childAdapter);
childAdapter.notifyDataSetChanged();
我有两个 RecyclerView。 Parent RecyclerView 工作完美,但父适配器中子项的 setadapter 不工作。
我试图在子适配器中创建一些日志消息,但它们甚至没有出现,因此适配器甚至没有启动
为了更好的理解,下面是一段代码。
MainFragment.java
// Set up the RecyclerView.
recyclerview = rootView.findViewById(R.id.recycler_view);
adapter = new TodayAdapter(getContext());
recyclerview.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerview.setAdapter(adapter);
taskViewModel = new ViewModelProvider(requireActivity()).get(TaskViewModel.class);
List<TaskList> categories = new ArrayList<>();
TaskList completedTasks = new TaskList("Completed Tasks",null);
TaskList incompletedTasks = new TaskList("Incompleted Tasks",null);
List<Task> intask = new ArrayList<>();
List<Task> comtask = new ArrayList<>();
// Update the cached copy of the words in the adapter.
// Get all the words from the database
// and associate them to the adapter.
taskViewModel.getAllTasks().observe( getActivity(), new Observer<List<Task>>() {
@Override
public void onChanged(List<Task> tasks) {
for(Task task : tasks){
if(task.getState().equals("0")) {
intask.add(task);
incompletedTasks.setTasks(intask);
} else{
comtask.add(task);
completedTasks.setTasks(comtask);
}
}
categories.add(incompletedTasks);
categories.add(completedTasks);
adapter.setCategory(categories);
}
});
ParentAdapter.java
public class TodayAdapter extends RecyclerView.Adapter<TodayAdapter.TodayHolder>{
private List<TaskList> categories;
public TodayAdapter(List<TaskList> todayLists) {
this.categories = todayLists;
}
public TodayAdapter(Context context) {
LayoutInflater mInflater = LayoutInflater.from(context);
}
@NonNull
@Override
public TodayHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
return new TodayAdapter.TodayHolder(itemView); }
@SuppressLint("NotifyDataSetChanged")
@Override
public void onBindViewHolder(@NonNull TodayHolder holder, int position) {
Log.d("test", Integer.toString(categories.size()));
if(categories!=null) {
TaskList category = categories.get(position);
holder.title.setText(category.getTitle());
holder.tasks.setHasFixedSize(true);
TaskAdapter taskAdapter = new TaskAdapter();
taskAdapter.setTasks(category.getTasks());
holder.tasks.setAdapter(taskAdapter);
taskAdapter.notifyDataSetChanged();
}
}
@Override
public int getItemCount() {
if(categories!=null)
return categories.size();
return 0;
}
public class TodayHolder extends RecyclerView.ViewHolder {
private TextView title;
private RecyclerView tasks;
public TodayHolder(@NonNull View itemView) {
super(itemView);
title=itemView.findViewById(R.id.title);
tasks=itemView.findViewById(R.id.tasks);
}
}
//Associates a list of tasks with this adapter
public void setCategory(List<TaskList> categories) {
this.categories = categories;
notifyDataSetChanged();
}
}
ChildAdapter.java
/**
* Adapter for the RecyclerView that displays a list of words.
*/
public class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.TaskHolder> {
private List<Task> tasks; // Cached copy of words
private OnItemClickListener listener;
public TaskAdapter(Context context) {
LayoutInflater mInflater = LayoutInflater.from(context);
}
public TaskAdapter() {
}
@NonNull
@Override
public TaskHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Log.d("test","rani fe task adapder");
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.task_item, parent, false);
return new TaskHolder(itemView);
}
@SuppressLint("ResourceAsColor")
@Override
public void onBindViewHolder(@NonNull TaskHolder holder, int position) {
Log.d("test","we are in =" +position);
if (tasks != null) {
Task currentTask = tasks.get(position);
holder.textViewTitle.setText(currentTask.getTitle());
holder.textViewDescription.setText(currentTask.getDescription());
switch (currentTask.getCategory()) {
case "1":
holder.layout.setBackgroundResource(R.color.button_beige);
if (currentTask.getState().equals("0")){
holder.view.setBackgroundResource(R.drawable.uncheck_beige);
holder.textViewTitle.setPaintFlags(0);
holder.textViewDescription.setPaintFlags(0);
}else{
holder.view.setBackgroundResource(R.drawable.check_beige);
holder.textViewTitle.setPaintFlags(holder.textViewTitle.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
holder.textViewDescription.setPaintFlags(holder.textViewDescription.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
}
break;
case "2":
holder.layout.setBackgroundResource(R.color.button_blue);
if(currentTask.getState().equals("0")){
holder.view.setBackgroundResource(R.drawable.uncheck_blue);
holder.textViewTitle.setPaintFlags(0);
holder.textViewDescription.setPaintFlags(0);
}
else{
holder.view.setBackgroundResource(R.drawable.check_blue);
holder.textViewTitle.setPaintFlags(holder.textViewTitle.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
holder.textViewDescription.setPaintFlags(holder.textViewDescription.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
}
break;
case "3":
holder.layout.setBackgroundResource(R.color.button_green);
if(currentTask.getState().equals("0")){
holder.view.setBackgroundResource(R.drawable.uncheck_green);
holder.textViewTitle.setPaintFlags(0);
holder.textViewDescription.setPaintFlags(0);
}
else{
holder.view.setBackgroundResource(R.drawable.check_green);
holder.textViewTitle.setPaintFlags(holder.textViewTitle.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
holder.textViewDescription.setPaintFlags(holder.textViewDescription.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
} break;
case "4":
holder.layout.setBackgroundResource(R.color.button_pink);
if(currentTask.getState().equals("0")){
holder.view.setBackgroundResource(R.drawable.uncheck_pink);
holder.textViewTitle.setPaintFlags(0);
holder.textViewDescription.setPaintFlags(0);
}
else{
holder.view.setBackgroundResource(R.drawable.check_pink);
holder.textViewTitle.setPaintFlags(holder.textViewTitle.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
holder.textViewDescription.setPaintFlags(holder.textViewDescription.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
}
break;
case "5":
holder.layout.setBackgroundResource(R.color.button_purple);
if(currentTask.getState().equals("0")){
holder.view.setBackgroundResource(R.drawable.uncheck_purple);
holder.textViewTitle.setPaintFlags(0);
holder.textViewDescription.setPaintFlags(0);
}
else{
holder.view.setBackgroundResource(R.drawable.check_purple);
holder.textViewTitle.setPaintFlags(holder.textViewTitle.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
holder.textViewDescription.setPaintFlags(holder.textViewDescription.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
}
break;
default:
holder.layout.setBackgroundResource(R.color.black);
if(currentTask.getState().equals("0")){
holder.view.setBackgroundResource(R.drawable.uncheck_black);
holder.textViewTitle.setPaintFlags(0);
holder.textViewDescription.setPaintFlags(0);
}
else{
holder.view.setBackgroundResource(R.drawable.check_black);
holder.textViewTitle.setPaintFlags(holder.textViewTitle.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
holder.textViewDescription.setPaintFlags(holder.textViewDescription.getPaintFlags()
| Paint.STRIKE_THRU_TEXT_FLAG);
}
break;
}
}
}
//getItemCount() is called many times, and when it is first called,
//mWords has not been updated (means initially, it's null, and we can't return null).
@Override
public int getItemCount() {
if (tasks != null)
return tasks.size();
return 0;
}
//Associates a list of tasks with this adapter
public void setTasks(List<Task> tasks) {
this.tasks = tasks;
notifyDataSetChanged();
if(tasks != null){
Log.d("test","task size =" +this.tasks.size());
}else Log.d("test","task size =" +0);
}
//to get the item from the id
public Task getTaskAt(int position) {
return tasks.get(position);
}
class TaskHolder extends RecyclerView.ViewHolder {
private TextView textViewTitle;
private TextView textViewDescription;
private View view;
private LinearLayout layout;
private RelativeLayout EditLayout;
public TaskHolder(@NonNull View itemView) {
super(itemView);
textViewTitle = itemView.findViewById(R.id.text_view_title);
textViewDescription = itemView.findViewById(R.id.text_view_description);
layout = itemView.findViewById(R.id.color);
view = itemView.findViewById(R.id.image);
EditLayout = itemView.findViewById(R.id.EditLayout);
EditLayout.setOnClickListener(v -> {
int position = getAdapterPosition();
listener.onItemClick(tasks.get(position));
});
view.setOnClickListener(v -> {
int position = getAdapterPosition();
listener.onDoneClick(tasks.get(position));
});
}
}
public interface OnItemClickListener {
void onItemClick(Task task);
void onDoneClick(Task task);
}
public void setOnItemClickListener(OnItemClickListener listener) {
this.listener = listener;
}
}
这是因为您必须先预取子项,然后再使用以下方法创建其适配器:
layoutManager.setInitialPrefetchItemCount(parentItem, .size());
你可以在这里找到完整的教程
https://www.geeksforgeeks.org/how-to-create-a-nested-recyclerview-in-android/
我通过像这样添加线性布局管理器来修复它
holder.tasks.setHasFixedSize(true);
ChildAdapter childAdapter = new ChildAdapter();
childAdapter.setList(category.getLists());
LinearLayoutManager layoutManager = new LinearLayoutManager(mContext);
holder.tasks.setLayoutManager(layoutManager);
holder.tasks.setAdapter(childAdapter);
childAdapter.notifyDataSetChanged();