gpt4 book ai didi

java - 一个适配器中有多个 View (充气器)

转载 作者:太空宇宙 更新时间:2023-11-04 13:59:29 24 4
gpt4 key购买 nike

如何在一个适配器中使用两个不同的 View ?我需要一种布局中的 3 个字段和另一种布局中的第 4 个字段。

如果屏幕上只有 1-5 个项目(扩展基本适配器),此代码可以正常工作:

@Override
public View getView (final int position, View convertView, ViewGroup parent) {
FieldsAndText p = getFields(position);

view = convertView;
if (position != 3) {
if (view == null) {
view = lInflater.inflate(R.layout.addproduct_item, parent, false);
}
((TextView) view.findViewById(R.id.addProductTextView)).setText(p.name);
EditText editText = (EditText) view.findViewById(R.id.addProductEditText);
editText.setText(p.value);
}
else if (position == 3) {
if (view == null) {
view = lInflater.inflate(R.layout.alternative_item, parent, false);
TextView textView = (TextView) view.findViewById(R.id.alternative_textView1);
}
}
return view;
}

但是当有超过 5 个项目并且我向下滚动时,出现错误:

Null pointer exception in: ((TextView) view.findViewById(R.id.addProductTextView)).setText(p.name);

最佳答案

您需要实现 getViewTypeCount()getItemViewType() 来向 AdapterView 传授多种类型的行。

例如,下面是一个带有 ListAdapter 的 Activity ,它具有单独的标题和详细信息布局:

/***
Copyright (c) 2008-2012 CommonsWare, LLC
Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy
of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
by applicable law or agreed to in writing, software distributed under the
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
OF ANY KIND, either express or implied. See the License for the specific
language governing permissions and limitations under the License.

From _The Busy Coder's Guide to Android Development_
http://commonsware.com/Android
*/

package com.commonsware.android.headerdetail;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class HeaderDetailListDemo extends ListActivity {
private static final String[][] items= {
{ "lorem", "ipsum", "dolor", "sit", "amet" },
{ "consectetuer", "adipiscing", "elit", "morbi", "vel" },
{ "ligula", "vitae", "arcu", "aliquet", "mollis" },
{ "etiam", "vel", "erat", "placerat", "ante" },
{ "porttitor", "sodales", "pellentesque", "augue", "purus" } };

@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setListAdapter(new IconicAdapter());
}

class IconicAdapter extends BaseAdapter {
@Override
public int getCount() {
int count=0;

for (String[] batch : items) {
count+=1 + batch.length;
}

return(count);
}

@Override
public Object getItem(int position) {
int offset=position;
int batchIndex=0;

for (String[] batch : items) {
if (offset == 0) {
return(Integer.valueOf(batchIndex));
}

offset--;

if (offset < batch.length) {
return(batch[offset]);
}

offset-=batch.length;
batchIndex++;
}

throw new IllegalArgumentException("Invalid position: "
+ String.valueOf(position));
}

@Override
public long getItemId(int position) {
return(position);
}

@Override
public int getViewTypeCount() {
return(2);
}

@Override
public int getItemViewType(int position) {
if (getItem(position) instanceof Integer) {
return(0);
}

return(1);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (getItemViewType(position) == 0) {
return(getHeaderView(position, convertView, parent));
}

View row=convertView;

if (row == null) {
row=getLayoutInflater().inflate(R.layout.row, parent, false);
}

ViewHolder holder=(ViewHolder)row.getTag();

if (holder == null) {
holder=new ViewHolder(row);
row.setTag(holder);
}

String word=(String)getItem(position);

if (word.length() > 4) {
holder.icon.setImageResource(R.drawable.delete);
}
else {
holder.icon.setImageResource(R.drawable.ok);
}

holder.label.setText(word);
holder.size.setText(String.format(getString(R.string.size_template),
word.length()));

return(row);
}

private View getHeaderView(int position, View convertView,
ViewGroup parent) {
View row=convertView;

if (row == null) {
row=getLayoutInflater().inflate(R.layout.header, parent, false);
}

Integer batchIndex=(Integer)getItem(position);
TextView label=(TextView)row.findViewById(R.id.label);

label.setText(String.format(getString(R.string.batch),
1 + batchIndex.intValue()));

return(row);
}
}
}

getViewTypeCount() 返回 2,因为我有两种类型的行。 getItemViewType() 根据 getItem() 方法的结果,为标题行返回 0,为详细信息行返回 1,该方法将 Integer 作为标题的模型数据,将数组中的数组中的 String 作为详细信息行的模型数据。

关于java - 一个适配器中有多个 View (充气器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29448888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com