Java 带节标题的Android网格视图
我计划在同一个网格视图中创建两种不同的列表。基本上,比如说一个汽车清单和一个自行车清单 我想在同一个网格视图中显示它们 我还想在cars列表之前甚至在bikes列表之前显示标题。我想要如下所示的东西 我知道网络上有很多这样的帖子,也有StackOverflow,但没有一个能回答我的问题。其中一些指向粘性标题库,一些建议将元素转换为标题,这将再次需要复杂的职位管理,我无法做到。Java 带节标题的Android网格视图,java,android,android-recyclerview,android-listview,android-gridview,Java,Android,Android Recyclerview,Android Listview,Android Gridview,我计划在同一个网格视图中创建两种不同的列表。基本上,比如说一个汽车清单和一个自行车清单 我想在同一个网格视图中显示它们 我还想在cars列表之前甚至在bikes列表之前显示标题。我想要如下所示的东西 我知道网络上有很多这样的帖子,也有StackOverflow,但没有一个能回答我的问题。其中一些指向粘性标题库,一些建议将元素转换为标题,这将再次需要复杂的职位管理,我无法做到。 任何建议或帮助都将不胜感激。您需要创建一个具有自定义侦听器接口的自定义适配器类,您可以 检测按钮是否已通过此侦听器单击
任何建议或帮助都将不胜感激。您需要创建一个具有自定义侦听器接口的自定义适配器类,您可以 检测按钮是否已通过此侦听器单击
public class YourAdapter extends BaseAdapter {
private YourCustomListener listener;
private List<Object> yourObjects;
private Context mContext;
public YourAdapter(final Context context, final YourCustomListener listener, final List<Object> yourObjects) {
this.listener = listener;
this.yourObjects = yourObjects;
mContext = context;
}
@Override
public int getCount() {
return yourObjects.size();
}
@Override
public Object getItem(final int position) {
return yourObjects.get(position);
}
@Override
public long getItemId(final int position) {
return position;
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
Button button;
View view;
if (convertView == null) {
LayoutInflater inflater = LayoutInflater.from(mContext);
view = inflater.inflate(R.layout.yourLayout, parent, false);
} else {
view = convertView;
}
final Object obj = getItem(position);
button = view.findViewById(R.id.yourbuttonid);
if (listener != null) {
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
listener.onButtonOnItemClicked(obj);
}
});
}
return view;
}
public void setListener(YourCustomListener listener) {
this.listener = listener;
}
public interface YourCustomListener {
void onButtonOnItemClicked(Object obj);
}
}
公共类YourAdapter扩展BaseAdapter{
私人听众;
私人物品清单;
私有上下文;
公共YourAdapter(最终上下文上下文、最终YourCustomListener侦听器、最终列出对象){
this.listener=listener;
this.yourObjects=yourObjects;
mContext=上下文;
}
@凌驾
public int getCount(){
返回yourObjects.size();
}
@凌驾
公共对象getItem(最终int位置){
返回您的对象。获取(位置);
}
@凌驾
公共长getItemId(最终整数位置){
返回位置;
}
@凌驾
公共视图getView(最终整型位置、最终视图转换视图、最终视图组父视图){
按钮;
视图;
if(convertView==null){
LayoutFlater充气机=LayoutFlater.from(mContext);
视图=充气机。充气(R.layout.yourLayout,父级,false);
}否则{
视图=转换视图;
}
最终对象obj=获取项目(位置);
button=view.findViewById(R.id.yourbuttonid);
if(侦听器!=null){
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(最终视图v){
listener.onButtonNonItemClicked(obj);
}
});
}
返回视图;
}
public void setListener(YourCustomListener侦听器){
this.listener=listener;
}
自定义侦听器的公共接口{
void onbutton未单击项(对象对象对象);
}
}
您需要创建一个具有自定义侦听器接口的自定义适配器类,您可以
检测按钮是否已通过此侦听器单击
public class YourAdapter extends BaseAdapter {
private YourCustomListener listener;
private List<Object> yourObjects;
private Context mContext;
public YourAdapter(final Context context, final YourCustomListener listener, final List<Object> yourObjects) {
this.listener = listener;
this.yourObjects = yourObjects;
mContext = context;
}
@Override
public int getCount() {
return yourObjects.size();
}
@Override
public Object getItem(final int position) {
return yourObjects.get(position);
}
@Override
public long getItemId(final int position) {
return position;
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
Button button;
View view;
if (convertView == null) {
LayoutInflater inflater = LayoutInflater.from(mContext);
view = inflater.inflate(R.layout.yourLayout, parent, false);
} else {
view = convertView;
}
final Object obj = getItem(position);
button = view.findViewById(R.id.yourbuttonid);
if (listener != null) {
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
listener.onButtonOnItemClicked(obj);
}
});
}
return view;
}
public void setListener(YourCustomListener listener) {
this.listener = listener;
}
public interface YourCustomListener {
void onButtonOnItemClicked(Object obj);
}
}
公共类YourAdapter扩展BaseAdapter{
私人听众;
私人物品清单;
私有上下文;
公共YourAdapter(最终上下文上下文、最终YourCustomListener侦听器、最终列出对象){
this.listener=listener;
this.yourObjects=yourObjects;
mContext=上下文;
}
@凌驾
public int getCount(){
返回yourObjects.size();
}
@凌驾
公共对象getItem(最终int位置){
返回您的对象。获取(位置);
}
@凌驾
公共长getItemId(最终整数位置){
返回位置;
}
@凌驾
公共视图getView(最终整型位置、最终视图转换视图、最终视图组父视图){
按钮;
视图;
if(convertView==null){
LayoutFlater充气机=LayoutFlater.from(mContext);
视图=充气机。充气(R.layout.yourLayout,父级,false);
}否则{
视图=转换视图;
}
最终对象obj=获取项目(位置);
button=view.findViewById(R.id.yourbuttonid);
if(侦听器!=null){
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(最终视图v){
listener.onButtonNonItemClicked(obj);
}
});
}
返回视图;
}
public void setListener(YourCustomListener侦听器){
this.listener=listener;
}
自定义侦听器的公共接口{
void onbutton未单击项(对象对象对象);
}
}
我认为解决办法很简单。创建RecyclerView并使用网格布局。创建一个适配器,并在其中使用两种类型的项。使用方法spanSizeLookup,重写getSpanSize()函数并设置节(1)的大小和其他项目的大小。就这样
spanSizeLookup的Kotlin代码:
val layoutManager = (recyclerView.layoutManager as GridLayoutManager)
layoutManager.spanSizeLookup = object : SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
return if (adapter.getItem((position) is Section) layoutManager.spanCount else 1
}
}
}
我认为解决办法很简单。创建RecyclerView并使用网格布局。创建一个适配器,并在其中使用两种类型的项。使用方法spanSizeLookup,重写getSpanSize()函数并设置节(1)的大小和其他项目的大小。就这样
spanSizeLookup的Kotlin代码:
val layoutManager = (recyclerView.layoutManager as GridLayoutManager)
layoutManager.spanSizeLookup = object : SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
return if (adapter.getItem((position) is Section) layoutManager.spanCount else 1
}
}
}
谢谢你的回答。它解决了我的问题。但很抱歉,我不得不接受@Jimale-Abdi-answer,因为它告诉我如何实现节头。再次感谢。你可以通过得到答案来实现。谢谢你的回答。它解决了我的问题。但很抱歉,我不得不接受@Jimale-Abdi-answer,因为它告诉我如何实现节头。再次感谢。您可以通过将spanCountIt Lead设置为scroll performance lagging来实现这一目标。它将导致scroll performance lagging设置为scroll performance lagging