【发布时间】:2018-08-13 07:43:01
【问题描述】:
我从这个link 观看了一个教程,用于创建可扩展的recyclerview,而不使用第三方应用程序来扩展recyclerview 并在其中膨胀自定义网格布局。
下面是使用的代码:
MainActivity
public class MainActivity extends AppCompatActivity {
RecyclerView expanderRecyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
expanderRecyclerView = findViewById(R.id.recyclerView);
initiateExpander();
}
private void initiateExpander() {
ArrayList<String> parentList = new ArrayList<>();
ArrayList<ArrayList> childListHolder = new ArrayList<>();
parentList.add("Fruits & Vegetables");
parentList.add("Beverages & Health");
parentList.add("Home & Kitchen");
ArrayList<String> childNameList = new ArrayList<>();
childNameList.add("Apple");
childNameList.add("Mango");
childNameList.add("Banana");
childListHolder.add(childNameList);
childNameList = new ArrayList<>();
childNameList.add("Red bull");
childNameList.add("Maa");
childNameList.add("Horlicks");
childListHolder.add(childNameList);
childNameList = new ArrayList<>();
childNameList.add("Knife");
childNameList.add("Vessels");
childNameList.add("Spoons");
childListHolder.add(childNameList);
ExpandableRecyclerViewAdapter expandableCategoryRecyclerViewAdapter =
new ExpandableRecyclerViewAdapter(getApplicationContext(), parentList,
childListHolder);
expanderRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
expanderRecyclerView.setAdapter(expandableCategoryRecyclerViewAdapter);
}
}
ExpandableRecyclerViewAdapter
public class ExpandableRecyclerViewAdapter extends
RecyclerView.Adapter<ExpandableRecyclerViewAdapter.ViewHolder> {
int previousExpandedPosition = -1, mExpandedPosition=-1;
ArrayList<String> nameList = new ArrayList<String>();
ArrayList<String> image = new ArrayList<String>();
ArrayList<Integer> counter = new ArrayList<Integer>();
ArrayList<ArrayList> itemNameList = new ArrayList<ArrayList>();
boolean isExpanded=true;
Context context;
public ExpandableRecyclerViewAdapter(Context context,
ArrayList<String> nameList,
ArrayList<ArrayList> itemNameList) {
this.nameList = nameList;
this.itemNameList = itemNameList;
this.context = context;
Log.d("namelist", nameList.toString());
for (int i = 0; i < nameList.size(); i++) {
counter.add(0);
}
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView name;
ImageButton dropBtn;
RecyclerView cardRecyclerView;
CardView cardView;
public ViewHolder(View itemView) {
super(itemView);
name = itemView.findViewById(R.id.categoryTitle);
dropBtn = itemView.findViewById(R.id.categoryExpandBtn);
cardRecyclerView = itemView.findViewById(R.id.innerRecyclerView);
cardView = itemView.findViewById(R.id.cardView);
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.card_collapseview, parent, false);
ExpandableRecyclerViewAdapter.ViewHolder vh = new ExpandableRecyclerViewAdapter.ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
holder.name.setText(nameList.get(position));
InnerRecyclerViewAdapter itemInnerRecyclerView = new InnerRecyclerViewAdapter(context ,itemNameList.get(position));
holder.cardRecyclerView.setLayoutManager(new GridLayoutManager(context, 2));
holder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (counter.get(position) % 2 == 0) {
holder.cardRecyclerView.setVisibility(View.VISIBLE);
} else {
holder.cardRecyclerView.setVisibility(View.GONE);
}
counter.set(position, counter.get(position) + 1);
}
});
holder.cardRecyclerView.setAdapter(itemInnerRecyclerView);
}
@Override
public int getItemCount() {
return nameList.size();
}
}
InnerRecyclerViewAdapter
public class InnerRecyclerViewAdapter extends
RecyclerView.Adapter<InnerRecyclerViewAdapter.ViewHolder> {
public ArrayList<String> nameList = new ArrayList<String>();
Context context;
public InnerRecyclerViewAdapter(Context context, ArrayList<String> nameList)
{
this.nameList = nameList;
this.context=context;
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView name;
CardView cardView;
public ViewHolder(View itemView) {
super(itemView);
name = itemView.findViewById(R.id.itemTextView);
cardView=itemView.findViewById(R.id.cardView);
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.card_expand_item_view, parent, false);
InnerRecyclerViewAdapter.ViewHolder vh = new InnerRecyclerViewAdapter.ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
holder.name.setText(nameList.get(position));
holder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(context, "Clicked on "+nameList.get(position),Toast.LENGTH_LONG).show();
}
});
}
@Override
public int getItemCount() {
return nameList.size();
}
}
我无法弄清楚如何修改此代码,以便 recyclerview 一次扩展一行...如果任何其他行已经扩展,它应该在扩展另一行时自动关闭。
请指导我如何做到这一点。
【问题讨论】:
-
展开前折叠前一个。
ExpandableRecyclerView不是官方的View。另外通过查看您的代码,我认为您在RecyclerView内使用RecyclerView,这是一场灾难。尝试使用一些实施良好的第三方库。 -
为此,您可以使用 ExpandableListView 并且它运行良好。
-
是的,我在其他行中使用recyclerview...如果任何其他行被扩展,我如何获得保留!? @ADM
-
你已经知道展开的位置了。只需全局保存即可。恕我直言,不要尝试使用一些 lib 或
ExpandableListView。如果你做一个项目。如果你只是在玩弄安卓,那么可以尝试一下。 -
ExpandableListView 可以看到这个:stackoverflow.com/questions/48449914/…
标签: android android-recyclerview