У меня есть ListView
, каждый элемент которого (т.е. TextView
) заполнен текстом песни песни. Всякий раз, когда я нажимаю на элемент, он должен быть выделен, а фон предыдущего выбранного элемента должен быть изменен на значение по умолчанию. Для этого я использую ListView.setOnItemClickListener
, как показано ниже:
public int songNo;
public int totalSongs;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.lyric_display);
songNo=0;
totalSongs=7;
ListView songLyricsListView = (ListView) findViewById(R.id.LyricDisplayListView);
MediaPlayer soundPlayer = new MediaPlayer();
songLyricsListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View selectedView, int pos,
long arg3) {
**//set background to older selection**
View oldSelectedView;
oldSelectedView = (View)adapter.getChildAt(songNo);
oldSelectedView.setBackgroundColor(0x00000000);
songNo = pos;
selectedView.setBackgroundColor(0xFFFFFFFF);
songLyricsListView.smoothScrollToPosition(songNo);
try {
soundPlayer.reset();
soundPlayer.setDataSource("/sdcard/0"+Integer.toString(songNo)+".mp3");
soundPlayer.prepare();
soundPlayer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
});
List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
String[] from = new String[] {"lyrics","translation"};
int[] to = new int[] {R.id.songTextView, R.id.translationTextView};
try {
InputStream is = getResources().openRawResource(R.raw.lyric_text);
BufferedInputStream bis = new BufferedInputStream(is);
int myInt=0;
for(int songno=0; songno<=totalSongs; songno++)
{
HashMap<String, String> map = new HashMap<String, String>();
ByteArrayBuffer myByteArray = new ByteArrayBuffer(100);
while((myInt = bis.read())!=-1)
{
if(myInt == 10) break;
myByteArray.append((byte)myInt);
}
String lyricsText = new String(myByteArray.toByteArray(), 0, myByteArray.length(), "UTF-8");
myByteArray.clear();
map.put("lyrics",lyricsText);
map.put("translation", Integer.toString(songno)+"- sample translation");
list.add((HashMap<String, String>)map);
}
bis.close();
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
adapter = new SpecialAdapter(
this,
list,
R.layout.lyrics_display_item,
from,
to );
songLyricsListView.setAdapter(adapter);
открытый класс SpecialAdapter расширяет SimpleAdapter {
public SpecialAdapter (Контекст контекста, Список> элементы, int ресурс, String [] из, int [] в) {
супер (контекст, элементы, ресурс, от, до);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = super.getView(position, convertView, parent);
if(position == songNo)
{
view.setBackgroundColor(0xFFFFFFFF);
}else
view.setBackgroundColor(0x00000000);
return view;
}
}
когда я устанавливаю больший размер шрифта для элемента списка, когда я выбираю 6-й элемент и снова я выбираю 5-й элемент в строке кода:
oldSelectedView = (View)adapter.getChildAt(songNo);
oldSelectedView
возвращается как null
. Но когда я использую мелкий шрифт, список помещается на одном экране и выбор 6-го элемента, а затем выбор 7-го или 5-го не создает никаких проблем.
Пожалуйста, помогите мне решить эту проблему ..