- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如何在一个适配器中使用两个不同的 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/
想问一下。有什么区别: LayoutInflater layoutInflater = (LayoutInflater) getBaseContext().getSystemService(Conte
我正在使用 RecyclerView 来保存 CardView 列表。在我运行 Lollipop 5.0.2 的设备上,应用程序运行良好并且列表正确显示数据。然而,在其他 Lollipop 之前的设备
简单:我想用 1 个宽度为 0dp 的子项来膨胀父项。 父级 xml: 子类: public class KeyButton extends RelativeLayout implements Vi
我正在尝试创建一个 android 键盘,现在我希望它只是膨胀,即显示来自 main.xml 的线性布局 这是java文件 package keyboard.rob.com; import ... p
我有以下适配器 public class CardAdapter extends RecyclerView.Adapter{ List list; int id; Context context;
我的 main.xml 中目前有一个 DrawerLayout。 AppBarLayout 中包含了一个 Toolbar,然后是一个简单的 LinearLayout 来交换 fragment 。 我导
由于不推荐使用 Kotlin Synthetics,我们正在迁移到 ViewBinding。 我已经尝试了很多关于 ViewStub、ViewBinding 的谷歌搜索和阅读文档,并为 Fragmen
我无法使用 LayoutInflater 扩充 xml(包含 QuickContactBadge 的布局)文件,以便在 ListView 中使用它。它不会产生编译/运行时错误或正确的预期输出。从 XM
我是一名优秀的程序员,十分优秀!