Java 当我使用gettag时,Listview有时为空
我在安卓系统中的观点有问题。我使用一个GridView,其中包含项目。每个项目都有名称、按钮、说明和图标。但每个项目也有一个列表视图。单击按钮时,我希望显示链接到该按钮的listview 启动时它可以工作,但当我上下滚动几次时,我的listview要么不显示,要么显示错误的listview 我读过很多其他的问题和文章,但我找不到我做错了什么 我也尝试过类似的方法,但仍然得到相同的结果Java 当我使用gettag时,Listview有时为空,java,android,listview,android-listview,Java,Android,Listview,Android Listview,我在安卓系统中的观点有问题。我使用一个GridView,其中包含项目。每个项目都有名称、按钮、说明和图标。但每个项目也有一个列表视图。单击按钮时,我希望显示链接到该按钮的listview 启动时它可以工作,但当我上下滚动几次时,我的listview要么不显示,要么显示错误的listview 我读过很多其他的问题和文章,但我找不到我做错了什么 我也尝试过类似的方法,但仍然得到相同的结果 if (convertView == null){ holder = new
if (convertView == null){
holder = new new ListHolder();
convertView.setTag(holder);
}
else {
holder = (ListHolder) convertView.getTag();
}
getView
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ListHolder holder;
HarmonicaItem harmonicaItem = ((MainActivity) context).getHarmonicaItems().get(position);
if (row == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
}
holder = new ListHolder();
holder.logo = (ImageView) row.findViewById(R.id.logo);
holder.line = (TextView) row.findViewById(R.id.line);
holder.button = (Button) row.findViewById(R.id.button);
holder.listView = (ListView) row.findViewById(R.id.subHarmonica);
holder.logo.setImageResource(harmonicaItem.logo);
holder.button.setText(harmonicaItem.title);
holder.button.setOnClickListener(onClickListener);
harmonicaItem.listView = holder.listView;
harmonicaItem.button = holder.button;
holder.listView.setTag(harmonicaItem);
holder.button.setTag(harmonicaItem);
row.setTag(holder);
return row;
}
模范班
static class ListHolder {
ImageView logo;
TextView line;
Button button;
ListView listView;
}
如何检索项目
@Override
public void onClick(View v) {
HarmonicaItem item = (HarmonicaItem) v.getTag();
}
gridview中项目的布局:
<RelativeLayout
android:id="@+id/buttonLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:gravity="center_vertical|left"
android:paddingLeft="115dp"
android:paddingRight="10dp"
android:text="loop"
android:textColor="@android:color/black"
android:textStyle="bold"/>
<ImageView
android:id="@+id/logo"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp" />
<TextView
android:id="@+id/line"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/button"
android:layout_alignBottom="@+id/button"
android:layout_centerVertical="true"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/logo"
android:text="00:00"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="@android:color/black"
android:textStyle="bold"/>
</RelativeLayout>
<ListView
android:id="@+id/subHarmonica"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/buttonLayout"
android:visibility="gone"/>
我的问题总结如下:
item.listView有时为空,有时为错误的listView
我的目标是填充listview,并在单击按钮时使其可见
我做错了什么
编辑
显然我在其他代码中犯了错误。当listview返回到gone时,我保存了listview。当我想让它再次出现时,它有时会出现错误的列表。因此,适配器实际上没有问题。请更新您的getView方法
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null)
{
holder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
convertView = inflater.inflate(R.layout.list_row, null);
holder.logo = (ImageView) row.findViewById(R.id.logo);
holder.line = (TextView) row.findViewById(R.id.line);
holder.button = (Button) row.findViewById(R.id.button);
holder.listView = (ListView) holder.findViewById(R.id.subHarmonica);
holder.listView.setTag(harmonicaItem);
holder.button.setTag(harmonicaItem);
holder.setTag(holder);
}
else {
holder = (ListHolder)row.getTag();
}
holder.logo.setImageResource(harmonicaItem.logo);
holder.button.setText(harmonicaItem.title);
holder.button.setOnClickListener(onClickListener);
return convertView;
}
试试这个。代码中存在一些问题 1.你错过了其他部分 2.如果条件允许,需要在内部设置标签
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ListHolder holder;
HarmonicaItem harmonicaItem = ((MainActivity) context).getHarmonicaItems().get(position);
if (row == null) {
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new ListHolder();
holder.logo = (ImageView) row.findViewById(R.id.logo);
holder.line = (TextView) row.findViewById(R.id.line);
holder.button = (Button) row.findViewById(R.id.button);
holder.listView = (ListView) row.findViewById(R.id.subHarmonica);
holder.listView.setTag(harmonicaItem);
holder.button.setTag(harmonicaItem);
row.setTag(holder);
}else{
holder = (ListHolder)row.getTag();
}
holder.logo.setImageResource(harmonicaItem.logo);
holder.button.setText(harmonicaItem.title);
holder.button.setOnClickListener(onClickListener);
return row;
}
编辑:
我删除了其中的两行代码
armonicaItem.listView = holder.listView;
harmonicaItem.button = holder.button;
我认为这是不必要的。试着不用它。多么糟糕的主意(将视图存储在数据项中)编辑:对不起,它是原始代码。你的意思是这是错误的armonicaItem.listView=holder.listView;harmonicaItem.button=holder.button;我尝试了你的代码,但仍然遇到同样的问题
harmonicatem.listView=holder.listView代码>和下一行…我想你添加它作为修复…我知道我复制了问题检查我的编辑代码@SelvinI已经尝试过这样做,但仍然会产生相同的问题是的,我已经尝试过你的答案,但它会给我相同的问题显示你正在使用('v')视图来检索标记。here=>'v.getTag()'()是否将ListView放在ViewHolder中?即使它真的能工作,那也是一个非常糟糕的设计。@shobhan我在gridview上设置了一个onclicklistener。gridview包含HarmonicaItems,您可以将ListHolder作为标记。和获得HarmonicaItem.你能不能定义一下你所说的错误列表视图是什么意思?