8

我有一个使用自定义光标适配器填充 ListView 的 ListView。

row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

   <LinearLayout
       android:orientation="vertical"
       android:layout_width="0dip"
       android:layout_weight="1"
       android:layout_height="fill_parent">
       <TextView
           android:id="@+id/title"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:singleLine="true"
           android:gravity="center_vertical"
           android:ellipsize="marquee"
           android:textSize="24dp" />
       <TextView
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:id="@+id/artist"
           android:singleLine="true"
           android:ellipsize="marquee"
           android:textSize="14dp" />
    </LinearLayout>
    <ImageView
       android:id="@+id/currentplaying"
       android:layout_width="wrap_content"
       android:layout_height="fill_parent"
       android:layout_marginLeft="1dip"
       android:src="@android:drawable/ic_media_play"
       android:contentDescription="@string/now_playing"
       android:visibility="gone" />
</LinearLayout>

如您所见,ImageView 的可见性消失了。我想让它对某一特定行可见。这是我尝试过的代码,但它不起作用......

View view = getListView().getAdapter().getView(0, null, null);
ImageView iv = (ImageView)view.findViewById(R.id.currentplaying);
iv.setVisibility(ImageView.VISIBLE);

提前致谢。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    if(convertView==null) {
        holder = new ViewHolder();
        convertView = inflater.inflate(R.layout.yourlayout, null);
        holder.imgViewLogo = (ImageView) convertView.findViewById(R.id.imgViewLogo);
        convertView.setTag(holder);
    }
    else {
        holder=(ViewHolder)convertView.getTag();
    }
    if(position==0) {     
        holder.imgViewLogo.setVisiblity(View.VISIBLE);
    }
    return convertView;
} 

编辑:

我让它工作了。我用它来启动 ListView 活动。

intent.putExtra("id", c.getInt(c.getColumnIndex(DatabaseHelper._ID)));
startActivity(intent);

在 ListView 活动中,

currentplayingid = getIntent().getExtras().getInt("id");    

然后我添加了这个bindview()

ImageView imgview = (ImageView)view.findViewById(R.id.currentplaying);
int id = c.getInt(c.getColumnIndex(DatabaseHelper._ID));
if (id == SongsListActivity.this.currentplayingid)
    imgview.setVisibility(View.VISIBLE);
else
    imgview.setVisibility(View.GONE);
4

10 回答 10

2

我让它工作了。我用它来启动列表视图活动。

intent.putExtra("id", c.getInt(c.getColumnIndex(DatabaseHelper._ID)));
startActivity(intent);

在列表视图活动中,

currentplayingid = getIntent().getExtras().getInt("id");    

然后我在 bindview() 中添加了这个

ImageView imgview = (ImageView)view.findViewById(R.id.currentplaying);
int id = c.getInt(c.getColumnIndex(DatabaseHelper._ID));
if ( id == SongsListActivity.this.currentplayingid )
imgview.setVisibility(View.VISIBLE);
else
imgview.setVisibility(View.GONE);
于 2012-04-24T02:11:31.443 回答
1

也许你应该在getView()你的适配器 中做到这一点

编辑:

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    // codes...

    if (position == 0)
    {
        holder.imgViewLogo.setVisibility(ImageView.VISIBLE);
    }
    else
    {
        holder.imgViewLogo.setVisibility(ImageView.GONE);
    }

    // codes...
}
于 2012-04-23T03:33:34.420 回答
0

您可以使用 setVisibility(int) 隐藏或显示视图。利用iv.setVisibility(View.VISIBLE);

于 2014-08-25T10:02:00.197 回答
0

我有同样的问题......我用非标准解决方案解决了,但对我有用......

v.setImageResource(R.color.transparent);

从安卓导入 R

import android.R;
于 2013-08-30T15:14:15.643 回答
0

我遇到了类似的问题,其中一些小部件会出现在某些行上,但不会出现在其他行上。问题是由于视图回收。我不确定这是否是您的问题,但无论如何您都应该处理它。诀窍是为每一行设置可见性;而不仅仅是您想要出现/消失的行。

所以:

if (position == 0)
{
    iv.setVisibility(ImageView.VISIBLE);
}
else
{
    iv.setVisibility(ImageView.GONE);
}

否则,您假设对于 0 以外的位置,可见性已消失,但视图回收可能并非如此。顺便说一句,我在 bindView 中完成这项工作。不确定这在技术上是否正确。

于 2012-04-23T04:35:53.707 回答
0

两者iv.setVisibility(View.VISIBLE);iv.setVisibility(ImageView.VISIBLE);都是正确的,但最好使用View而不是ImageView因为VISIBLE&是在类GONE中定义的。View

你最改变Both Visibility(VISIBLEGONE)在那if。喜欢:

if(?)
    iv.setVisibility(View.VISIBLE);
else iv.setVisibility(View.GONE);
于 2014-01-26T06:11:14.883 回答
0

如果它工作了一段时间,那么我可以帮助你。每当您移动列表视图时会发生什么情况,它会再次重新创建所有视图,在这种情况下它永远不会保存视图的最后状态。因此,您需要做的是保存每个图像视图的状态,并在 getView() 中进行相应设置。我正在发布我的答案之一,它可能会对您有所帮助。这里有一些代码可以帮助你:我将创建一个布尔数组列表。

私有 ArrayList imageview_visible = null;

然后我将在我的构造函数中将所有 imageview 的状态设置为 false:

for (int i=0; i < no_of_elements.size(); i++) {
    imageview_visible.add(i, false);
}

在您的 getView 中编写以下代码:

public View getView (int position, View convertView, ViewGroup parent) { //编写你的代码

 if (imageview_visible.get(position) == true)
 {
     //SET YOUR IMAGE VIEW AS VISIBLE
 } else {
    // SET IMAGEVIEW AS GONE
 }

}

每当您取消隐藏或隐藏视图时,只需将其保存到 imageview_visible.set(true 或 false)中,这将保存您所有 imageview 的状态并相应地设置每个图像视图

于 2012-04-23T04:40:39.290 回答
0

使用 LayoutInflater 获取视图对象

LayoutInflater inflater = this.getLayoutInflater();
View rowView = inflater.inflate(R.layout.row, null, true);
ImageView iv = (ImageView)view.findViewById(R.id.currentplaying);
iv.setVisibility(ImageView.VISIBLE);
于 2012-04-23T04:41:00.717 回答
0

你必须这样做

iv.setVisibility(View.VISIBLE);
于 2012-04-23T03:33:42.660 回答
0

尝试以下代码,

     private class ViewHolder
{
    ImageView imgViewLogo;

}

  @Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    ViewHolder holder;
    if(convertView==null)
    {
        holder = new ViewHolder();
        convertView = inflater.inflate(R.layout.yourlayout, null);

        holder.imgViewLogo = (ImageView) convertView.findViewById(R.id.imgViewLogo);
        convertView.setTag(holder);
    }
    else
    {
        holder=(ViewHolder)convertView.getTag();
    }

       if(position==0)
     {     
    holder.imgViewLogo.setVisiblity(View.VISIBLE);
        }


    return convertView;
} 

它对我有用......它可以帮助你。

于 2012-04-23T04:24:09.653 回答