2012-01-04 5 views
0

2 개의 레이아웃이있는 어댑터가 있고 세부 사항이있는 노래 항목은 두 번째 레이아웃이고 현재 노래 선택 레이아웃의 재생 위치에 대한 탐색 표시 줄과 세부 정보가있는 노래 항목입니다. 내 어댑터는 여기에 있습니다 : 사용자가 onItemClickListener를 사용하여 어댑터를 클릭 할 때 난 단지 SeekBar를 설정이 어댑터에서 android에서 어댑터의 childview 가져 오기

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를 얻을 싶어요. 내가 어떻게 해? 나는 이와 같은 방법을 만들었지 만 일하지는 않는다.
public Seekbar getSeekbar(){ 
    ViewHolder view=(ViewHolder)getView(currentlyPlay,null,null); 
    return view.seekBar; 
} 

나는 내가 현재 위치를 선택한보기를 얻을 수 있습니다 내 onItemClick에 currentlyPlay보기를 설정 .. 그러나 그것은 나를 위해 작동하지 않습니다 ... 당신이 도와 드릴까요?

답변

2

당신은 내가 clickedView.findViewById (R.id.seek_lagu)를 사용할 수 있습니다

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

하여 특정 위치의보기를 얻을 수 있습니다? 나는 그것을 시도했지만 아무 구성 요소도 업데이트하지 않았다. 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 holder.seekbar.setMax (100); 하지만 notifyDataSetChanged를 호출 할 때 아무 효과가 없습니다 .. 기본 getView를 호출하는 것으로 추측합니다. 어댑터의 원점 getView를 반환합니다. 다른 솔루션은 무엇입니까? – mrhands

관련 문제