в ListView.setOnItemClickListener the (View) adapter.getChildAt (6);возвращает ноль - PullRequest
0 голосов
/ 07 февраля 2012

У меня есть 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-го не создает никаких проблем.

Пожалуйста, помогите мне решить эту проблему ..

Ответы [ 2 ]

0 голосов
/ 10 февраля 2012

listadapter.notifyDataSetChanged () в onItemClickListner () решает проблему.

0 голосов
/ 07 февраля 2012

Возможно, это связано с тем, что ListAdapter не имеет той же позиции, что и номер вашей песни.Возможно, использование настраиваемого адаптера списка и использование массива решает проблему: ссылка

Это пример настраиваемого адаптера списка в APIDemos

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...