如何添加线性布局始终是 RecyclerView 中的第一个元素?
How to add Linear Layout to be always the first element in RecyclerView?
我有一个带有 CardView 的 RecyclerView,它显示从 database.And 读取的数据,这没有问题。
现在的问题是,我想在同一个 RecyclerView 中添加一个包含 ImageView 和 TextView 的线性布局,并使其始终成为 RecyclerView 中的第一个元素。
这就是我想要的 acheive.The RecyclerView 中的第一个元素始终是线性布局,不管它下面的 CardView 有什么不同。
我从 this link 尝试了这个教程,它似乎处理不同的 ViewType 取决于数据库中的数据,这不是我想要的。
我想要的是
1) 这个线性布局是静态的
2) 始终是 RecyclerView 中的第一个元素。
我检查了 if(index == 0) in
onCreateViewHolder` android 工作室无法识别的索引。
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(index== 0) {
View feedInput = LayoutInflater.from(parent.getContext())
.inflate(R.layout.feed_input, parent, false);
return new MyViewHolder(feedInput);
}else {
View feedItemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.feed_item, parent, false);
return new MyViewHolder(feedItemView);
}
}
如果需要linearLayout始终可见,即使recyclerView滚动了,也可以将LinearLayout放在RecyclerView外面。
做类似的事情:
<RelativeLayout
--your attribute-->
<LinearLayout
--your attributes-->
//Your LinearLayout elements here
</LinearLayout>
<RecyclerView
--your attributes--/>
</RelativeLayout>
如果线性布局需要成为列表的第一个元素,您可以检查适配器中的位置,如果它是第一个位置(索引 == 0),请使用 LinearLayout
扩充布局,否则使用您已经使用的列表项布局进行扩充。
编辑:
这是一个例子:
只需实施getItemViewType()
,并注意onCreateViewHolder()
中的viewType
参数。
所以你做这样的事情:
@Override
public int getItemViewType(int position) {
if (position == 0)
return 1;
else
return 2;
}
然后在onCreateViewHolder
中根据你的viewType
膨胀你的不同布局。
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == 1) {
// inflate your first item layout & return that viewHolder
} else {
// inflate your second item layout & return that viewHolder
}
}
你应该寻找 viewType
,没有 index
:
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
class LinearViewHolder extends RecyclerView.ViewHolder {
public LinearViewHolder(View itemView){
View feedInput = LayoutInflater.from(parent.getContext())
.inflate(R.layout.feed_input, parent, false);
return new LinearViewHolder(feedInput);
}
}
class ItemViewHolder extends RecyclerView.ViewHolder {
public ItemViewHolder(View itemView){
View feedItemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.feed_item, parent, false);
return new ItemViewHolder(feedItemView);
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(viewType == 0) {
return new LinearViewHolder();
} else {
return new ItemViewHolder();
}
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
if(holder.getItemViewType() == 0) {
LinearViewHolder linearHolder = LinearViewHolder(holder);
} else {
ItemViewHolder itemHolder = ItemViewHolder(holder);
}
}
}
希望对您有所帮助。
您可以通过创建一个同时包含 LinearLayout
和 CardView
的布局来实现,让我们称之为 both_layout
。保持 LinearLayout 的可见性 GONE
.
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = (View) LayoutInflater.from(parent.getContext())
.inflate(R.layout.both_layout, parent, false);
// Inflate both the layout.
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
if (position == 0) {
holder.makeFirst();
}
}
在您的 ViewHolder.makeFirst
中使 LinearLayout
可见并删除 CardView
。
public void makeFirst() {
linearlayout.setVisibility(VISIBLE);
cardView.setVisibility(GONE);
}
我有一个带有 CardView 的 RecyclerView,它显示从 database.And 读取的数据,这没有问题。
现在的问题是,我想在同一个 RecyclerView 中添加一个包含 ImageView 和 TextView 的线性布局,并使其始终成为 RecyclerView 中的第一个元素。
这就是我想要的 acheive.The RecyclerView 中的第一个元素始终是线性布局,不管它下面的 CardView 有什么不同。
我从 this link 尝试了这个教程,它似乎处理不同的 ViewType 取决于数据库中的数据,这不是我想要的。
我想要的是
1) 这个线性布局是静态的
2) 始终是 RecyclerView 中的第一个元素。
我检查了 if(index == 0) in
onCreateViewHolder` android 工作室无法识别的索引。
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(index== 0) {
View feedInput = LayoutInflater.from(parent.getContext())
.inflate(R.layout.feed_input, parent, false);
return new MyViewHolder(feedInput);
}else {
View feedItemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.feed_item, parent, false);
return new MyViewHolder(feedItemView);
}
}
如果需要linearLayout始终可见,即使recyclerView滚动了,也可以将LinearLayout放在RecyclerView外面。 做类似的事情:
<RelativeLayout
--your attribute-->
<LinearLayout
--your attributes-->
//Your LinearLayout elements here
</LinearLayout>
<RecyclerView
--your attributes--/>
</RelativeLayout>
如果线性布局需要成为列表的第一个元素,您可以检查适配器中的位置,如果它是第一个位置(索引 == 0),请使用 LinearLayout
扩充布局,否则使用您已经使用的列表项布局进行扩充。
编辑:
这是一个例子:
只需实施getItemViewType()
,并注意onCreateViewHolder()
中的viewType
参数。
所以你做这样的事情:
@Override
public int getItemViewType(int position) {
if (position == 0)
return 1;
else
return 2;
}
然后在onCreateViewHolder
中根据你的viewType
膨胀你的不同布局。
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == 1) {
// inflate your first item layout & return that viewHolder
} else {
// inflate your second item layout & return that viewHolder
}
}
你应该寻找 viewType
,没有 index
:
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
class LinearViewHolder extends RecyclerView.ViewHolder {
public LinearViewHolder(View itemView){
View feedInput = LayoutInflater.from(parent.getContext())
.inflate(R.layout.feed_input, parent, false);
return new LinearViewHolder(feedInput);
}
}
class ItemViewHolder extends RecyclerView.ViewHolder {
public ItemViewHolder(View itemView){
View feedItemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.feed_item, parent, false);
return new ItemViewHolder(feedItemView);
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(viewType == 0) {
return new LinearViewHolder();
} else {
return new ItemViewHolder();
}
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
if(holder.getItemViewType() == 0) {
LinearViewHolder linearHolder = LinearViewHolder(holder);
} else {
ItemViewHolder itemHolder = ItemViewHolder(holder);
}
}
}
希望对您有所帮助。
您可以通过创建一个同时包含 LinearLayout
和 CardView
的布局来实现,让我们称之为 both_layout
。保持 LinearLayout 的可见性 GONE
.
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = (View) LayoutInflater.from(parent.getContext())
.inflate(R.layout.both_layout, parent, false);
// Inflate both the layout.
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
if (position == 0) {
holder.makeFirst();
}
}
在您的 ViewHolder.makeFirst
中使 LinearLayout
可见并删除 CardView
。
public void makeFirst() {
linearlayout.setVisibility(VISIBLE);
cardView.setVisibility(GONE);
}