我有一个带有CardView的RecyclerView,它显示从数据库中读取的数据。这对它没有任何问题。
现在的问题是,我想在同一个RecyclerView中添加一个内容同时包含ImageView和TextView的线性布局,并使它始终是RecyclerView中的第一个元素。
这就是我想要实现的目标.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);
}
}
答案 0 :(得分:3)
您可以通过创建包含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);
}
答案 1 :(得分:2)
如果您需要始终可见linearLayout,即使滚动了recyclerView,您也可以将LinearLayout放在RecyclerView之外。 做类似的事情:
<RelativeLayout
--your attribute-->
<LinearLayout
--your attributes-->
//Your LinearLayout elements here
</LinearLayout>
<RecyclerView
--your attributes--/>
</RelativeLayout>
如果linearlayout需要是列表的第一个元素,你可以检查适配器中的位置,如果它是第一个位置(索引== 0),用你的LinearLayout
膨胀布局,否则膨胀您可以使用的列表项布局。
编辑:
以下是一个例子:
只需实施getItemViewType()
,并处理viewType
中的onCreateViewHolder()
参数。
所以你做了类似的事情:
@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
}
}
答案 2 :(得分:0)
您应该寻找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);
}
}
}
希望这有帮助。