Java 如何在另一个recyclerView中添加recyclerView
我计划开发一个应用程序,在Java 如何在另一个recyclerView中添加recyclerView,java,android,android-recyclerview,android-cardview,Java,Android,Android Recyclerview,Android Cardview,我计划开发一个应用程序,在recyclerCardView中显示一些动态数据。所以我决定添加一个名为CheckBoxRecyclerView 在我的主回收视图中。这是我的应用程序代码: 我的主要活动: setContentView(R.layout.activity_startup); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); reminderView = (RecyclerView) findViewById(R.id.re
recyclerCardView
中显示一些动态数据。所以我决定添加一个名为CheckBoxRecyclerView
在我的主回收视图中
。这是我的应用程序代码:
我的主要活动:
setContentView(R.layout.activity_startup);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
reminderView = (RecyclerView) findViewById(R.id.reminder_recycler_view);
RlayoutManager = new LinearLayoutManager(this);
reminderView.setLayoutManager(RlayoutManager);
setSupportActionBar(toolbar);
cardView = (CardView) findViewById(R.id.card_first);
cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext() , ReminderActivity.class);
startActivity(intent);
}
});
ReminderHelper helper = new ReminderHelper(getApplicationContext());
ReminderAdapter reminderAdapter = new ReminderAdapter(helper);
ContentValues reminderValues = new ContentValues();
ContentValues checkboxValues = new ContentValues();
// Devlopment Part ->
reminderValues.put("reminderTitle" , "A Reminder Title");
reminderValues.put("reminderLastModDate" , 0);
reminderValues.put("reminderAlarm" , 0);
reminderValues.put("reminderPicURI" , "skjshksjh");
reminderValues.put("ReminderBackground" , "#00796b");
checkboxValues.put("checkboxText" , "This is a CheckBox");
checkboxValues.put("isDone" , false);
checkboxValues.put("checkboxReminderID" , 0);
reminderAdapter.INSERT_REMINDER(reminderValues);
reminderAdapter.INSERT_CHECKBOX(checkboxValues);
File dbPath = getApplicationContext().getDatabasePath(ReminderHelper.DATABASE_NAME);
if(dbPath.exists()){
List<Reminder> reminders = new ReminderAdapter(helper).getAllReminders();
List<CheckBoxItem> checkBoxItems = new ReminderAdapter(helper).getAllCheckBoxes();
RAdapter = new RAdapter(reminders , getApplicationContext() , checkBoxItems);
reminderView.setAdapter(RAdapter);
}else{
}
setContentView(R.layout.activity\u启动);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
reminderView=(RecyclerView)findViewById(R.id.Reminders\u recycler\u视图);
RlayoutManager=新的LinearLayoutManager(本);
提醒视图。设置布局管理器(RlayoutManager);
设置支持操作栏(工具栏);
cardView=(cardView)findViewById(R.id.card_优先);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Intent Intent=new Intent(getApplicationContext(),rementeractivity.class);
星触觉(意向);
}
});
提醒帮助器=新的提醒帮助器(getApplicationContext());
ReminderAdapter ReminderAdapter=新的提醒适配器(帮助器);
ContentValues提醒值=新ContentValues();
ContentValues checkboxValues=新ContentValues();
//开发部分->
提醒价值。放置(“提醒”、“提醒标题”);
提醒值.put(“提醒LastModDate”,0);
提醒值。放置(“提醒臂”,0);
提醒值。put(“提醒值”、“skjshksjh”);
reminderValues.put(“ReminderBackground”,“00796b”);
checkboxValues.put(“checkboxText”,“这是一个复选框”);
checkboxValues.put(“isDone”,false);
checkboxValues.put(“checkboxrementerid”,0);
提醒适配器。插入提醒(提醒值);
reminderAdapter.INSERT_复选框(复选框值);
文件dbPath=getApplicationContext().getDatabasePath(rementerHelper.DATABASE_NAME);
if(dbPath.exists()){
列表提醒=新建提醒适配器(helper).getAllMembers();
List checkBoxItems=新的提醒适配器(helper).getAllCheckBoxes();
RAdapter=新RAdapter(提醒、getApplicationContext()、复选框项);
提醒查看设置适配器(RAdapter);
}否则{
}
它的布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="8dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:paddingTop="8dp"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.smflog.sreminder.StartupActivity"
tools:showIn="@layout/app_bar_startup">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:id="@+id/reminder_recycler_view"
android:scrollbars="vertical"
android:layout_height="match_parent">
正如您所看到的,RAdapter的setTitle起作用。您可以使用LayoutInflater将动态数据膨胀为布局文件
更新:首先在CardView的布局中创建一个线性布局,并为其分配一个ID。
然后创建一个要充气的布局文件。最后,在“RAdaper”类中的onBindViewHolder
方法中。编写以下代码:
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = mInflater.inflate(R.layout.my_list_custom_row, parent, false);
之后,您可以初始化数据并使用RAdapter数据单击侦听器。希望能有帮助
可能有用:)不久前我遇到了类似的问题,我的情况是外部回收器视图工作得很好,但是内部/第二个回收器视图的适配器有一些小问题,所有的方法都启动了构造函数,甚至调用了getCount()方法,虽然最终方法负责生成视图ie
1。从未调用onBindViewHolder()方法。-->问题1。
2。当它最终被调用时,它从不显示回收器视图的列表项/行。-->问题2。
发生这种情况的原因:当您将一个回收器视图放在另一个回收器视图中时,第一个/外部回收器视图的高度不会自动调整。它是在创建第一个/外部视图时定义的,然后保持固定状态。此时,您的第二个/内部回收器视图尚未加载其项目,因此其高度设置为零,即使在获取数据时也不会更改。然后,当调用第二个/内部回收器视图中的onBindViewHolder()时,它会获取项目,但没有空间显示它们,因为其高度仍然为零。因此,即使onBindViewHolder()将项目添加到第二个recycler视图中,也不会显示它们
解决方案::您必须为第二个回收器视图创建自定义LinearLayoutManager,就是这样。
要创建自己的LinearLayoutManager:创建一个名为CustomLinearLayoutManager
的Java类,并将下面的代码粘贴到其中无需更改
公共类CustomLinearLayoutManager扩展了LinearLayoutManager{
私有静态最终字符串标记=CustomLinearLayoutManager.class.getSimpleName();
公共CustomLinearLayoutManager(上下文){
超级(上下文);
}
公共CustomLinearLayoutManager(上下文上下文、int方向、布尔反转){
超级(上下文、方向、反转);
}
私有int[]mMeasuredDimension=新int[2];
@凌驾
测量时的公共空隙(RecyclerView.Recycler Recycler,RecyclerView.State State,int widthSpec,int heightSpec){
最终int-widthMode=View.MeasureSpec.getMode(widthmspec);
最终int heightMode=View.MeasureSpec.getMode(heightSpec);
最终int-widthSize=View.MeasureSpec.getSize(widthSpec);
最终int heightSize=View.MeasureSpec.getSize(heightSpec);
整数宽度=0;
整数高度=0;
对于(int i=0;ipublic class RAdapter extends RecyclerView.Adapter<RAdapter.ViewHolder> {
List<Reminder> reminder;
private Context context;
private LinearLayoutManager lln;
private CAdapter checkBoxAdapter;
private List<CheckBoxItem> checkBoxItems;
public static class ViewHolder extends RecyclerView.ViewHolder {
public CardView rCardView;
public RecyclerView recyclerView;
public TitleView rTitleView;
public ViewHolder(View itemView) {
super(itemView);
rCardView = (CardView) itemView.findViewById(R.id.reminder_card);
rTitleView = (TitleView) itemView.findViewById(R.id.reminder_title);
recyclerView = (RecyclerView) itemView.findViewById(R.id.checkbox_recycler_view);
}
}
public RAdapter(List<Reminder> reminder, Context context, List<CheckBoxItem> checkBoxItems) {
this.reminder = reminder;
this.context = context;
this.checkBoxItems = checkBoxItems;
}
@Override
public RAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.reminder_card, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(RAdapter.ViewHolder holder, int position) {
lln = new LinearLayoutManager(context);
holder.recyclerView.setLayoutManager(lln);
checkBoxAdapter = new CAdapter(checkBoxItems, context);
holder.recyclerView.setAdapter(checkBoxAdapter);
holder.rCardView.setCardBackgroundColor(Color.parseColor("#00796b"));
holder.rTitleView.setText(reminder.get(position).getReminderTitle());
}
@Override
public int getItemCount() {
return reminder.size();
}
}
public class CAdapter extends RecyclerView.Adapter<CAdapter.ViewHolder> {
List<CheckBoxItem> checkBoxItems;
Context context;
public static class ViewHolder extends RecyclerView.ViewHolder {
public TitleView checkBoxTitle;
public ImageView deleteCheckBox;
public CheckBox checkBoxCheckBox;
public ViewHolder(View itemView) {
super(itemView);
checkBoxTitle = (TitleView) itemView.findViewById(R.id.checkbox_item_text);
checkBoxCheckBox = (CheckBox) itemView.findViewById(R.id.checkbox_item_checkbox);
Log.d("CAdapterLog", "Adpater Holded !!!!! :( ");
deleteCheckBox = (ImageView) itemView.findViewById(R.id.btn_delete_checkbox);
}
}
public CAdapter(List<CheckBoxItem> checkBoxItems, Context context) {
this.checkBoxItems = checkBoxItems;
this.context = context;
Log.d("CAdapterLog", "Adpater Created !!!!! :( ");
}
@Override
public CAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.checkbox_item, parent, false);
ViewHolder vh = new ViewHolder(v);
Log.d("CAdapterLog", "Adpater ViewHolded :( !!!!! :( ");
return vh;
}
@Override
public void onBindViewHolder(CAdapter.ViewHolder holder, int position) {
Boolean isCheckboxChecked = Boolean.parseBoolean(checkBoxItems.get(position).getCheckBoxIsDone());
String checkBoxText = checkBoxItems.get(position).getCheckBoxBody();
Log.d("CAdapterLog", "Adpater Binded :( ");
final int checkboxID = Integer.parseInt(checkBoxItems.get(position).getCheckBoxID());
int reminderCheckBoxID = Integer.parseInt(checkBoxItems.get(position).getCheckBoxReminderID());
holder.deleteCheckBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("CAdapterLog", "Cross Button Clicked !");
}
});
holder.checkBoxCheckBox.setChecked(isCheckboxChecked);
holder.checkBoxTitle.setText(checkBoxText);
}
@Override
public int getItemCount() {
return checkBoxItems.size();
}
}
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = mInflater.inflate(R.layout.my_list_custom_row, parent, false);
public class CustomLinearLayoutManager extends LinearLayoutManager {
private static final String TAG = CustomLinearLayoutManager.class.getSimpleName();
public CustomLinearLayoutManager(Context context) {
super(context);
}
public CustomLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
}
private int[] mMeasuredDimension = new int[2];
@Override
public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) {
final int widthMode = View.MeasureSpec.getMode(widthSpec);
final int heightMode = View.MeasureSpec.getMode(heightSpec);
final int widthSize = View.MeasureSpec.getSize(widthSpec);
final int heightSize = View.MeasureSpec.getSize(heightSpec);
int width = 0;
int height = 0;
for (int i = 0; i < getItemCount(); i++) {
measureScrapChild(recycler, i, View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
mMeasuredDimension);
if (getOrientation() == HORIZONTAL) {
width = width + mMeasuredDimension[0];
if (i == 0) {
height = mMeasuredDimension[1];
}
} else {
height = height + mMeasuredDimension[1];
if (i == 0) {
width = mMeasuredDimension[0];
}
}
}
switch (widthMode) {
case View.MeasureSpec.EXACTLY:
width = widthSize;
case View.MeasureSpec.AT_MOST:
case View.MeasureSpec.UNSPECIFIED:
}
switch (heightMode) {
case View.MeasureSpec.EXACTLY:
height = heightSize;
case View.MeasureSpec.AT_MOST:
case View.MeasureSpec.UNSPECIFIED:
}
setMeasuredDimension(width, height);
}
private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,
int heightSpec, int[] measuredDimension) {
try {
View view = recycler.getViewForPosition(position);
if (view != null) {
RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec,
getPaddingLeft() + getPaddingRight(), p.width);
int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec,
getPaddingTop() + getPaddingBottom(), p.height);
view.measure(childWidthSpec, childHeightSpec);
measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin;
measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin;
recycler.recycleView(view);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class DynamicListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int FOOTER_VIEW = 1;
private static final int FIRST_LIST_ITEM_VIEW = 2;
private static final int FIRST_LIST_HEADER_VIEW = 3;
private static final int SECOND_LIST_ITEM_VIEW = 4;
private static final int SECOND_LIST_HEADER_VIEW = 5;
private ArrayList<ListObject> firstList = new ArrayList<ListObject>();
private ArrayList<ListObject> secondList = new ArrayList<ListObject>();
public DynamicListAdapter() {
}
public void setFirstList(ArrayList<ListObject> firstList) {
this.firstList = firstList;
}
public void setSecondList(ArrayList<ListObject> secondList) {
this.secondList = secondList;
}
public class ViewHolder extends RecyclerView.ViewHolder {
// List items of first list
private TextView mTextDescription1;
private TextView mListItemTitle1;
// List items of second list
private TextView mTextDescription2;
private TextView mListItemTitle2;
// Element of footer view
private TextView footerTextView;
public ViewHolder(final View itemView) {
super(itemView);
// Get the view of the elements of first list
mTextDescription1 = (TextView) itemView.findViewById(R.id.description1);
mListItemTitle1 = (TextView) itemView.findViewById(R.id.title1);
// Get the view of the elements of second list
mTextDescription2 = (TextView) itemView.findViewById(R.id.description2);
mListItemTitle2 = (TextView) itemView.findViewById(R.id.title2);
// Get the view of the footer elements
footerTextView = (TextView) itemView.findViewById(R.id.footer);
}
public void bindViewSecondList(int pos) {
if (firstList == null) pos = pos - 1;
else {
if (firstList.size() == 0) pos = pos - 1;
else pos = pos - firstList.size() - 2;
}
final String description = secondList.get(pos).getDescription();
final String title = secondList.get(pos).getTitle();
mTextDescription2.setText(description);
mListItemTitle2.setText(title);
}
public void bindViewFirstList(int pos) {
// Decrease pos by 1 as there is a header view now.
pos = pos - 1;
final String description = firstList.get(pos).getDescription();
final String title = firstList.get(pos).getTitle();
mTextDescription1.setText(description);
mListItemTitle1.setText(title);
}
public void bindViewFooter(int pos) {
footerTextView.setText("This is footer");
}
}
public class FooterViewHolder extends ViewHolder {
public FooterViewHolder(View itemView) {
super(itemView);
}
}
private class FirstListHeaderViewHolder extends ViewHolder {
public FirstListHeaderViewHolder(View itemView) {
super(itemView);
}
}
private class FirstListItemViewHolder extends ViewHolder {
public FirstListItemViewHolder(View itemView) {
super(itemView);
}
}
private class SecondListHeaderViewHolder extends ViewHolder {
public SecondListHeaderViewHolder(View itemView) {
super(itemView);
}
}
private class SecondListItemViewHolder extends ViewHolder {
public SecondListItemViewHolder(View itemView) {
super(itemView);
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v;
if (viewType == FOOTER_VIEW) {
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_footer, parent, false);
FooterViewHolder vh = new FooterViewHolder(v);
return vh;
} else if (viewType == FIRST_LIST_ITEM_VIEW) {
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_first_list, parent, false);
FirstListItemViewHolder vh = new FirstListItemViewHolder(v);
return vh;
} else if (viewType == FIRST_LIST_HEADER_VIEW) {
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_first_list_header, parent, false);
FirstListHeaderViewHolder vh = new FirstListHeaderViewHolder(v);
return vh;
} else if (viewType == SECOND_LIST_HEADER_VIEW) {
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_second_list_header, parent, false);
SecondListHeaderViewHolder vh = new SecondListHeaderViewHolder(v);
return vh;
} else {
// SECOND_LIST_ITEM_VIEW
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_second_list, parent, false);
SecondListItemViewHolder vh = new SecondListItemViewHolder(v);
return vh;
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
try {
if (holder instanceof SecondListItemViewHolder) {
SecondListItemViewHolder vh = (SecondListItemViewHolder) holder;
vh.bindViewSecondList(position);
} else if (holder instanceof FirstListHeaderViewHolder) {
FirstListHeaderViewHolder vh = (FirstListHeaderViewHolder) holder;
} else if (holder instanceof FirstListItemViewHolder) {
FirstListItemViewHolder vh = (FirstListItemViewHolder) holder;
vh.bindViewFirstList(position);
} else if (holder instanceof SecondListHeaderViewHolder) {
SecondListHeaderViewHolder vh = (SecondListHeaderViewHolder) holder;
} else if (holder instanceof FooterViewHolder) {
FooterViewHolder vh = (FooterViewHolder) holder;
vh.bindViewFooter(position);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public int getItemCount() {
int firstListSize = 0;
int secondListSize = 0;
if (secondList == null && firstList == null) return 0;
if (secondList != null)
secondListSize = secondList.size();
if (firstList != null)
firstListSize = firstList.size();
if (secondListSize > 0 && firstListSize > 0)
return 1 + firstListSize + 1 + secondListSize + 1; // first list header, first list size, second list header , second list size, footer
else if (secondListSize > 0 && firstListSize == 0)
return 1 + secondListSize + 1; // second list header, second list size, footer
else if (secondListSize == 0 && firstListSize > 0)
return 1 + firstListSize; // first list header , first list size
else return 0;
}
@Override
public int getItemViewType(int position) {
int firstListSize = 0;
int secondListSize = 0;
if (secondList == null && firstList == null)
return super.getItemViewType(position);
if (secondList != null)
secondListSize = secondList.size();
if (firstList != null)
firstListSize = firstList.size();
if (secondListSize > 0 && firstListSize > 0) {
if (position == 0) return FIRST_LIST_HEADER_VIEW;
else if (position == firstListSize + 1)
return SECOND_LIST_HEADER_VIEW;
else if (position == secondListSize + 1 + firstListSize + 1)
return FOOTER_VIEW;
else if (position > firstListSize + 1)
return SECOND_LIST_ITEM_VIEW;
else return FIRST_LIST_ITEM_VIEW;
} else if (secondListSize > 0 && firstListSize == 0) {
if (position == 0) return SECOND_LIST_HEADER_VIEW;
else if (position == secondListSize + 1) return FOOTER_VIEW;
else return SECOND_LIST_ITEM_VIEW;
} else if (secondListSize == 0 && firstListSize > 0) {
if (position == 0) return FIRST_LIST_HEADER_VIEW;
else return FIRST_LIST_ITEM_VIEW;
}
return super.getItemViewType(position);
}
}