无法设置视图背景

时间:2014-01-06 15:50:53

标签: android listview view baseadapter

我想制作一个用音乐表示声音抒情的应用程序, 我将歌词放在自定义列表视图中,布局如下(行的布局),以及用逗号分隔的文本中的歌词时间, 那么,我想用媒体滚动。

这是我对行的自定义布局:          

<TextView
    android:id="@+id/custom_text_arabic"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="10dp"
    android:gravity="center"
    android:lineSpacingExtra="15dp"
    android:textSize="20sp" />

<TextView
    android:id="@+id/custom_text_persian"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:lineSpacingExtra="10dp"
    android:textColor="#999999"
    android:textSize="12sp" />

 </LinearLayout>

我在列表视图中有这个自定义行布局的适配器, 我有一个与MediaPlayer一起播放的音乐文件,我得到声音的当前位置并检查在一个时间阵列中查找列表视图中行的位置,然后我滚动到列表视图中的那一行,旁边这个东西,我希望行背景变为黑色!

因此,我使用此代码获取该行并进行更改!

// cAdapter is the name of my BaseAdapter and whereIsMe is current child of listview
// that i want to manipulate it
View mVi = cAdapter.getView(whereIsMe-1, null, lv); 
TextView persian = (TextView) mVi.findViewById(R.id.custom_text_persian);
// this toast works great!
Toast.makeText(getApplicationContext(),persian.getText(), Toast.LENGTH_LONG).show();
// this part of code is not working!
persian.setBackgroundColor( Color.BLACK );

问题是:

我可以完美地在TextView中烘焙文本!但我不能改变TextView背景或任何其他操作!为什么以及如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

调用getView不会返回ListView的实际子级。有两个选项,您可以为getChild调用ListView并更新背景颜色或调用notifyDataSetChanged并在适配器getView方法中设置背景颜色。

答案 1 :(得分:0)

适配器的getView方法并不意味着在使用它时使用。

阅读有关为listView创建自定义适配器的一些教程。然后你可以做任何你想做的事。

这是一个关于自定义适配器的好读物; http://www.vogella.com/tutorials/AndroidListView/article.html

要从适配器外部获取所需的视图,请使用以下内容:

View view;

int nFirstPos = lv_data.getFirstVisiblePosition();
int nWantedPos = invalidaEste - nFirstPos;

if ((nWantedPos >= 0) && (nWantedPos <= lv_data.getChildCount())
{
 view = lv_data.getChildAt(nWantedPos);
 if (view == null)
  return;
 // else we have the view we want
}

Sometimes listView.getChildAt(int index) returns NULL (Android)

这是因为在内部调用getView来创建视图。通过你正在做的事实上你实际上创建了一个新的视图,它没有被添加到任何屏幕/布局,所以你做的任何改变都不会反映在UI上