![](/img/trans.png)
[英]Android setVisibility View.INVISIBLE and View.GONE aren't working
[英]When I set some items to view.invisible in getView(), others don't appear
Visi在我的自定義適配器 getView 方法中,我有一個用於不同類型布局單元格的開關盒。 我為這些單元格引用了一個布局 xml,並通過 setVisibility(View....) 顯示/隱藏某些元素 在我的第一個單元格“StreamLayout”中,我只想顯示一個 imageView,“Boombox”。 我將此圖像視圖設置為在所有其他布局中不可見,但是當我這樣做時,它不會出現在第一個布局中。 我將提供我的 getView 方法和我的布局 xml:
獲取視圖:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
holder = null;
int type = getItemViewType(position);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.listview_cell, null);
holder = new ViewHolder();
} else {
holder = (ViewHolder) convertView.getTag();
}
switch (type) {
case STREAM_LAYOUT:
convertView = mInflater.inflate(R.layout.listview_cell, null);
ImageView boombox = (ImageView) convertView.findViewById(R.id.boombox).setVisibility(View.Visible);
convertView.findViewById(R.id.cell_image).setVisibility(View.GONE);
convertView.findViewById(R.id.divider).setVisibility(View.GONE);
convertView.findViewById(R.id.song).setVisibility(View.GONE);
convertView.findViewById(R.id.artist).setVisibility(View.GONE);
convertView.findViewById(R.id.bottom_layout).setVisibility(View.GONE);
convertView.setTag(holder);
case TALKSET_LAYOUT:
convertView.findViewById(R.id.boombox).setVisibility(View.GONE);
convertView.findViewById(R.id.cell_image).setVisibility(View.GONE);
convertView.findViewById(R.id.divider).setVisibility(View.GONE);
convertView.findViewById(R.id.playcut).setVisibility(View.GONE);
holder.talkset = (TextView) convertView.findViewById(R.id.talk_break_text);
holder.talkset.setText("TALKSET");
holder.talkset_icon = (ImageView) convertView.findViewById(R.id.talk_break_image);
holder.talkset_icon.setImageResource(R.drawable.temp_talkset);
convertView.setTag(holder);
break;
case BREAKPOINT_LAYOUT:
convertView.findViewById(R.id.boombox).setVisibility(View.GONE);
convertView.findViewById(R.id.cell_image).setVisibility(View.GONE);
convertView.findViewById(R.id.divider).setVisibility(View.GONE);
convertView.findViewById(R.id.artist).setVisibility(View.GONE);
//convertView.findViewById(R.id.boombox).setVisibility(View.GONE);
long l = Long.parseLong(oslist.get(position).get("hour"));
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(l);
calendar.setTimeInMillis(l * 1000);
int hour = calendar.get(Calendar.HOUR);
holder.song.setText("Breakpoint: "+hour+":00");
holder.breakpoint = (TextView) convertView.findViewById(R.id.talk_break_text);
holder.breakpoint.setText("BREAKPOINT");
holder.breakpoint_icon = (ImageView) convertView.findViewById(R.id.talk_break_image);
holder.breakpoint_icon.setImageResource(R.drawable.temp_talkset);
convertView.setTag(holder);
break;
case PLAYCUT_LAYOUT: //Playcut
convertView = mInflater.inflate(R.layout.listview_cell, null);
convertView.findViewById(R.id.boombox).setVisibility(View.GONE);
holder.cell_image = (ImageView) convertView.findViewById(R.id.cell_image);
try {
if(oslist.get(position).get("albumArtUrl")!=null) {
Picasso
.with(context)
.load(oslist.get(position).get("albumArtUrl"))
.placeholder(R.drawable.no_album_art)
.error(R.drawable.no_album_art).into(holder.cell_image);
}else{
Picasso
.with(context)
.load(oslist.get(position).get("artistArtUrl"))
.placeholder(R.drawable.no_album_art)
.error(R.drawable.no_album_art).into(holder.cell_image);
}
} catch (IllegalArgumentException e) {
holder.cell_image.setImageResource(R.drawable.no_album_art);
}
holder.song = (TextView) convertView.findViewById(R.id.song);
holder.artist = (TextView) convertView.findViewById(R.id.artist);
holder.song.setText(oslist.get(position).get("songTitle"));
holder.artist.setText(oslist.get(position).get("artistName"));
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
updateView(position);
}
});
convertView.setTag(holder);
break;
case NULL_LAYOUT:
convertView.setTag(holder);
break;
}
return convertView;
}
我的 XML
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:src="@drawable/boombox"
android:id="@+id/boombox"
/>
<!-- Versatile image view storage for either boombox, no album art image, or album art -->
<ImageView
android:id="@+id/cell_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
/>
<!-- Divider between image and data -->
<View
android:id="@+id/divider"
android:layout_width="fill_parent"
android:layout_height="1dp"
android:background="@android:color/darker_gray"/>
<!-- Layout for bottom half of playcut cells -->
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/bottom_layout"
android:layout_below="@id/divider">
<!-- Data for Song and Artist -->
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/playcut">
<TextView
android:id="@+id/song"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
android:gravity="center"
/>
<TextView
android:id="@+id/artist"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/song"
android:gravity="center"
/>
</RelativeLayout>
<!-- Talkset and breakpoint cell data -->
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/talk_break"
android:paddingLeft="1dp"
android:paddingTop="1dp"
android:paddingBottom="1dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/talk_break_image"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/talk_break_text"
android:layout_toRightOf="@id/talk_break_image"/>
</RelativeLayout>
<!-- Playcut Cell, clicked, displaying Facebook, Twitter, heart, and search icons -->
<TableLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stretchColumns="0,1,2,3,4"
android:paddingBottom="2dp"
android:id="@+id/table">
<TableRow>
<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/twitter_icon"/>
<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/facebook_icon"/>
<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/unclicked_heart_icon"/>
<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/search_icon"/>
</TableRow>
</TableLayout>
</RelativeLayout>
</LinearLayout>
這不起作用的原因是因為您使用的是ViewHolder
,它將維護對所有適配器項的每個 UI 元素的引用。
因此,如果一個元素在第一次迭代中被設置為View.GONE
並且不再被觸及,它將保持該狀態,無論它在 XML 中是如何定義的。
要解決此問題,您應該始終根據您使用的布局在getView()
明確設置該元素的可見性,因為如果它不是第一次迭代,您將引用 ViewHolder 及其所處的狀態,而不是由 XML 文件膨脹的視圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.