2015-11-08 2 views
-1

Я создаю очень простое ядровое приложение. Я использую GridView, который содержит элементы (представление звука). Элемент состоит из ImageView и TextViewКак получить позицию позиции на клике, установленном в классе адаптера?

У меня проблема в моем адаптере. Вот код:

public class SoundAdapter extends ArrayAdapter<Sound>{ 

    private Sound[] items; 
    private Context context = null; 

    public SoundAdapter(Context context, int textViewResourceId, Sound[] items) { 
     super(context, textViewResourceId, items); 
     this.items = items; 
     this.context = context; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     SoundHolder holder = null; 

     if (row == null) { 
      LayoutInflater vi = ((Activity)context).getLayoutInflater(); 
      row = vi.inflate(R.layout.list_row, null); 

      holder = new SoundHolder(); 
      holder.imgIcon = (ImageView)row.findViewById(R.id.icon); 
      holder.txtDescription = (TextView)row.findViewById(R.id.description); 

      row.setTag(holder); 

      //Here is the clickListener I want 

     }else { 
      holder = (SoundHolder)convertView.getTag(); 
     } 

     Sound sound = items[position]; 

     if(sound != null){ 
      holder.txtDescription.setText(sound.getDescription()); 
      holder.imgIcon.setImageResource(R.drawable.muscle1); 
     } 

     return row; 
    } 

    static class SoundHolder 
    { 
     ImageView imgIcon; 
     TextView txtDescription; 
    } 
} 

В настоящее время у меня есть onItemClickListener на моем GridView в моем основных, которые создают новый объект MediaPlayer, связанный с щелкнутым пунктом. Таким образом, событие щелчка для всех пункта (TextView + ImageView)

То, что я хочу сделать, это clickListener только на ImageView в GetView() метод, где я ставлю комментарий строку:

holder.imgIcon.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         //create the MediaPlayer object 
         //start the media player 
        } 
}); 

Но с этим решением я не могу получить доступ к позиции элемента внутри clickListener. Поэтому я не могу получить доступ к правильному звуку. (Мне нужно положение, чтобы получить звук и создать объект MediaPlayer)

У вас есть идея, как добиться чего-то подобного?

Заранее спасибо.

+0

'Но с этим решением я не могу получить доступ к позиции item' подхода является правильным, дайте мне знаете, какая проблема связана с использованием текущего кода? –

+0

Внутри clickListener я не могу получить доступ к параметру позиции метода getView(), поэтому я не могу получить звук, связанный с этим изображением (каждый звук имеет одинаковое изображение в ImageView по умолчанию), и я не могу создайте MediaPlayer следующим образом: 'MediaPlayer.create (context, mSounds [position] .getSoundResourceId());' потому что я не могу выполнить mSounds [position]. – Mtoypc

ответ

1

Внутри clickListener я не могу получить доступ к параметру позиции в методе GetView()

position либо объявить параметр getView способа, как final или использовать getTag/setTag метод ImageView для получения позиции внутри OnClick метод.

Использование getTag/setTag:

if (row == null) { 
     // your code here... 
     row.setTag(holder); 
    }else { 
     holder = (SoundHolder)convertView.getTag(); 
    } 
    Sound sound = items[position]; 
    // add click listener here 
    holder.imgIcon.setTag(String.valueOf(position)); 

и в методе OnClick получить позицию из V:

@Override 
    public void onClick(View v) { 
     int pos=Integer.parseInt(v.getTag().toString()); 
     //create the MediaPlayer object 
     //start the media player 
    } 
+0

Спасибо! Он отлично работает! Я чувствую себя очень глупо, потому что я не создавал clickListener в правильном месте. Я потратил много часов, пытаясь найти решение, и теперь у меня это кажется очевидным. Большое спасибо. Просто вы можете сказать мне, что является лучшим решением: параметр позиции в финальном или тег-решении? – Mtoypc

+0

@Mtoypc: Оба способа лучше всего –

+0

Хорошо, я приму окончательный метод. благодаря – Mtoypc

Смежные вопросы