Использование кнопок в строке Listview android

В моем приложении для Android я использую Listview, и каждая строка списка будет иметь текстовое представление и кнопку воспроизведения/паузы. Здесь я показываю аудиофайл в каждой строке списка. Когда пользователь нажимает кнопку воспроизведения, аудиофайл запускается, а значок кнопки воспроизведения изменяется на паузу. Если я снова нажму ту же кнопку, он остановит этот аудиофайл и значок паузы. кнопка будет играть.

Проблема в том, что если я получаю доступ к кнопке воспроизведения 1-й строки и нажимаю кнопку воспроизведения другой строки, значок 1-й строки должен измениться. Я не знаю, как реализовать эту функцию. Пожалуйста, помогите мне решить эту проблему.

Метод getView() пользовательского адаптера:

  public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        RowItem_ringtone rowItem = getItem(position);

        LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.ringtone_row, null);
            holder = new ViewHolder();

            holder.txtTitle = (TextView) convertView
                    .findViewById(R.id.ringtoneTitle);
            holder.btnPlay = (ImageButton) convertView
                    .findViewById(R.id.btnPlay);
            holder.btnSet = (ImageButton) convertView.findViewById(R.id.btnSet);
            convertView.setTag(holder);
        } else
            holder = (ViewHolder) convertView.getTag();

        holder.txtTitle.setText(rowItem.getRingTitle());
        holder.btnPlay.setTag(rowItem.getRingId());
        holder.btnSet.setTag(rowItem.getRingId());

        holder.btnPlay.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                Toast.makeText(getContext(), v.getTag().toString(),
                        Toast.LENGTH_LONG).show();
                if (CustomListViewAdapter_ringtone.mp != null) {
                    if (CustomListViewAdapter_ringtone.mp.isPlaying()) {
                        CustomListViewAdapter_ringtone.mp.stop();
                        CustomListViewAdapter_ringtone.mp.release();
                    }
                }
                mp = MediaPlayer.create(getContext(),
                        Integer.parseInt(v.getTag().toString()));
                mp.start();
                v.setBackgroundResource(R.drawable.set_icon);
                btnId = Integer.parseInt(v.getTag().toString());
            }
        });
return convertView;
    }

person Zankhna    schedule 06.08.2013    source источник
comment
опубликуйте свой код .. что вы сделали до сих пор   -  person Srikanth Pai    schedule 06.08.2013
comment
Но я предлагаю вместо использования прослушивателя кликов внутри вашего пользовательского адаптера; используйте прослушиватель кликов по элементу списка внутри вашей деятельности, где вы отображаете свой список.   -  person nilkash    schedule 06.08.2013


Ответы (4)


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

Используйте так

yourlistview.setOnItemClickListener(new OnItemClickListener()
{
    @Override public void onItemClick(AdapterView<?> arg0, View arg1,int position, long         arg3)
{ 
    Toast.makeText(SuggestionActivity.this, "" + position, Toast.LENGTH_SHORT).show();
}
});

Этот пример кода работает для меня:

View view = null;

 private OnItemClickListener onItemClickListener = new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            if(view != null)
            {
                TextView count = (TextView) view.findViewById(R.id.downloadCount);
                count.setText("007");
            }
            view = arg1;

        }
    };
person nilkash    schedule 06.08.2013
comment
но как я получу идентификатор этой строки? - person Zankhna; 06.08.2013
comment
когда вы впервые нажимаете на строку, вы получаете идентификатор этой строки, чтобы вы могли сохранить ее во временной переменной, а в следующий раз, когда вы щелкнете по другой строке, вы просто проверите этот временный идентификатор и в соответствии с этим измените свой пользовательский интерфейс для этой строки - person nilkash; 06.08.2013
comment
Японял твою точку зрения. но в следующий раз, если я нажму на другую строку, значок ранее использованной строки также должен измениться. Как получить этот функционал? - person Zankhna; 06.08.2013
comment
Я знаю, как получить идентификатор ранее доступной строки. Но мой вопрос в том, как получить доступ к предыдущей строке из текущей строки? - person Zankhna; 06.08.2013
comment
конго... :) Удачного кодирования - person nilkash; 06.08.2013
comment
Проблема решена, но теперь я столкнулся с другой проблемой. Если я прокручиваю свой список, идентификатор кнопки изменяется. Если я не прокручиваю список, он правильно отображает значок. Но как только я прокручиваю свой список, значок текущей строки и другой строки меняется. - person Zankhna; 06.08.2013
comment
Хорошо, приятель, я проверю и дам тебе знать, как правильно - person nilkash; 06.08.2013
comment
Вы нашли какое-либо решение для моей проблемы? Я искал много раз, но не нашел никакого решения. - person Zankhna; 06.08.2013

Просто сохраните ссылку на последнюю нажатую кнопку в методе OnListItemClick.

public class Something {
    private CustomListItem previouslyClickedListItem;

    @Override
    public void onListItemClick(ListView listView, View view, int position, long id) {
        CustomListItem item = (CustomListItem) view;
        if (item != previouslyClickedListItem) {
            // Set previouslyClickedListItem to not clicked
            prevouslyClickedListItem = item;
            // Set item to clicked
        } else {
            // Set prevouslyClickListItem to not clicked
        }
    }
}
person arnefm    schedule 06.08.2013

Вы должны использовать собственный адаптер listview, и ваш код должен находиться внутри метода getView.

В этом методе после findviewbyid просто присваиваем кнопкам теги.

например, btn.setTag(позиция);

а затем, когда вы нажмете кнопку воспроизведения, просто получите этот тег. например, int clickedposition = (Intger)btn.getTag();

Теперь вы сможете изменить значок только этой конкретной строки.

person android developer    schedule 06.08.2013

Ниже приведен фрагмент кода для вашего спасения. Я использовал кнопку переключения, например. вы можете изменить соответственно

public class CustomListviewAdapter extends BaseAdapter {

  private View PreviousView=null;

  public View getView(final int position, View convertView, final ViewGroup parent) {

  togglebutton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

        View CurrentView = v;
          if(PreviousView != null && PreviousView != CurrentView){
             ToggleButton tb=(ToggleButton)PreviousView.findViewById(R.id.togglebutton);
             tb.setChecked(false);
            }

          PreviousView=CurrentView;
         }
    });
  }
}
person Himanshu Patel    schedule 05.07.2015