2012-01-04 2 views
0

У меня есть адаптер с 2-мя макетами. Fisrt one - это элемент песни с деталями, а второй макет - это элемент песни с деталями и панель поиска для позиции воспроизведения выбранной композиции. Мой адаптер здесь:Получить детское вид адаптера в андроиде

package org.mrhands.player.adapter; 

import java.io.FileNotFoundException; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.HashMap; 
import java.util.Iterator; 
import java.util.List; 
import java.util.Set; 

import org.mrhands.player.DataHelper; 
import org.mrhands.player.R; 
import org.mrhands.player.model.AudioFile; 
import org.mrhands.player.service.MusicService; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.provider.MediaStore; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AlphabetIndexer; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.SectionIndexer; 
import android.widget.SeekBar; 
import android.widget.SeekBar.OnSeekBarChangeListener; 
import android.widget.TextView; 
import android.widget.AdapterView.OnItemClickListener; 

public class LaguListAdapter extends BaseAdapter implements SectionIndexer { 
AlphabetIndexer indexer; 
List<AudioFile> listAudioFile; 
Context context; 
final int LIST_LAGU = 0; 
final int LIST_LAGU_WITH_SEEKBAR = 1; 
int currentlyPlay = -1; 
OnSeekBarChangeListener onSeekBarChangeListener; 
HashMap<String, Integer> alphaIndexer; 

/** 
* parameter ini digunakan untuk mendapatkan seekbar dari view yang terpilih 
* dari adapter 
* 
* @param currentlyPlay 
*/ 
public void setCurrentlyPlay(int currentlyPlay) { 
    this.currentlyPlay = currentlyPlay; 
} 
public AudioFile getCurrentPlay(){ 
    return listAudioFile.get(currentlyPlay); 
} 

String[] sections; 
String sortedColumn = MediaStore.Audio.Media.DISPLAY_NAME; 
MusicService service; 
public LaguListAdapter(Context context, List<AudioFile> listAudioFile,OnSeekBarChangeListener listener,MusicService service) { 
    this.context = context; 
    this.onSeekBarChangeListener=listener; 
    this.service=service; 
    this.listAudioFile = listAudioFile; 
    alphaIndexer = new HashMap<String, Integer>(); 
    // in this hashmap we will store here the positions for 
    // the sections 

    int size = listAudioFile.size(); 
    for (int i = size - 1; i >= 0; i--) { 
     AudioFile element = listAudioFile.get(i); 
     alphaIndexer.put(element.getTitle().substring(0, 1), i); 
     // We store the first letter of the word, and its index. 
     // The Hashmap will replace the value for identical keys are putted 
     // in 
    } 

    // now we have an hashmap containing for each first-letter 
    // sections(key), the index(value) in where this sections begins 

    // we have now to build the sections(letters to be displayed) 
    // array .it must contains the keys, and must (I do so...) be 
    // ordered alphabetically 

    Set<String> keys = alphaIndexer.keySet(); // set of letters ...sets 
    // cannot be sorted... 

    Iterator<String> it = keys.iterator(); 
    ArrayList<String> keyList = new ArrayList<String>(); // list can be 
    // sorted 

    while (it.hasNext()) { 
     String key = it.next(); 
     keyList.add(key); 
    } 

    Collections.sort(keyList); 

    sections = new String[keyList.size()]; // simple conversion to an 
    // array of object 
    keyList.toArray(sections); 

} 

class ViewHolder { 
    TextView textJudulLagu; 
    TextView textPenyanyi; 
    ImageView imageLagu; 
    SeekBar seekbar; 
    int ref; 

} 

public Object getItem(int position) { 
    return position; 
} 

public long getItemId(int position) { 
    return position; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    View view = convertView; 
    ViewHolder holder = new ViewHolder(); 
    int viewType = getItemViewType(position);//ambil tipe dari layout adapter 
    if (view == null) { 
     LayoutInflater inflate = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     if (viewType == LIST_LAGU) {//cek jika layout yang terpilih adalah list lagu maka gunakan layout list lagu 
      view = inflate.inflate(R.layout.list_lagu, null); 
     } else if (viewType == LIST_LAGU_WITH_SEEKBAR) {//yang ini menggunakan layout seekbar 
      view = inflate.inflate(R.layout.list_lagu_with_seekbar, null); 
      holder.seekbar = (SeekBar) view.findViewById(R.id.seek_lagu); 
      holder.seekbar.setMax((int) service.getCurrentPlay().getDuration()); 
      holder.seekbar.setOnSeekBarChangeListener(onSeekBarChangeListener); 

     } 
     holder.imageLagu = (ImageView) view 
       .findViewById(R.id.list_lagu_gambar); 
     holder.textPenyanyi = (TextView) view 
       .findViewById(R.id.list_lagu_penyanyi); 
     holder.textJudulLagu = (TextView) view 
       .findViewById(R.id.list_lagu_judul); 
     view.setTag(holder); 
    } else { 
     holder = (ViewHolder) view.getTag(); 
    } 
    holder.ref = position; 
    AudioFile file = listAudioFile.get(position); 
    holder.textPenyanyi.setText(file.getArtist()); 
    holder.textJudulLagu.setText(file.getTitle()); 
    Bitmap b; 
    try { 
     b = DataHelper.getAlbumArtBitmap(context, file); 
     holder.imageLagu.setImageBitmap(b); 
    } catch (FileNotFoundException e) { 
     holder.imageLagu.setImageDrawable(context.getResources() 
       .getDrawable(R.drawable.albumart)); 
    } 
    return view; 
} 

public int getPositionForSection(int section) { 
    String letter = sections[section]; 
    return alphaIndexer.get(letter); 
} 

@Override 
public int getItemViewType(int position) { 
    return position == currentlyPlay ? LIST_LAGU_WITH_SEEKBAR : LIST_LAGU; 
} 

@Override 
public int getViewTypeCount() { 
    return 2; 
} 

public int getSectionForPosition(int position) { 
    // you will notice it will be never called (right?) 
    Log.v("getSectionForPosition", "called"); 
    return 0; 
} 

public Object[] getSections() { 
    return sections; 
} 

public int getCount() { 
    return listAudioFile.size(); 
} 

} 

В этом адаптере я только установить SeekBar, чтобы показать, когда пользователь нажимает на адаптер с помощью onItemClickListener, а затем я хочу, чтобы получить SeekBar от выбранного адаптера. Как мне это сделать? Я сделал такой метод, но не работал.

public Seekbar getSeekbar(){ 
    ViewHolder view=(ViewHolder)getView(currentlyPlay,null,null); 
    return view.seekBar; 
} 

Я поставил точку зрения currentlyPlay на моем onItemClick, так что я могу получить текущую позицию выбранного вида .. Но это не работа для меня .. Вы можете помочь?

ответ

2

Вы можете получить представление о конкретной позиции по

View clickedView = yourAdapter.getView(position, null, null); 
+1

можно использовать clickedView.findViewById (R.id.seek_lagu) ?. Я попробовал, но никаких компонентов не обновлялось. Мне нужно вызвать adapter.notifyDataSetChanged()? – mrhands

+0

Да, представление должно быть обновлено обновлением списка – Arslan

+0

Я попробовал это так: LaguListAdapter.ViewHolder holder = (ViewHolder) adapter.getView (arg2, null, null) .getTag(); \t \t \t holder.seekbar.setProgress (50); \t \t \t владелец.seekbar.setMax (100); но когда я вызвал notifyDataSetChanged, эффекта нет. Я предполагаю, что он вызвал getView по умолчанию, который возвращает начало getView адаптера .. любое другое решение? – mrhands