简体   繁体   中英

handling click of buttons in list view item android

I have a custom list view where each list item has two buttons, one text view and one seek bar where the seek bar visibility is set to gone in list item's XML.

Now what I want to do is on click of button one in the list item I want to hide the text view and display the seek bar of that list item whose button is clicked and show hide the seek bar and display the text view of all other list items.

The code that I have written works well if the total items are less than the views that can be displayed at once in a list view but for a lot of views this does not works.

What I am doing is load a list of files from aa folder into the list view and play the in the list view only

Please tell me where I am going wrong. Any help would be appreciated.

My Adapter Code:

public class AudioFileListAdapter extends BaseAdapter {
Context context;
ArrayList<String> fileList;
LayoutInflater inflater;
String folder;
ListView mListView;
public MediaPlayer mPlayer;
public Handler seekHandler;
SeekBar mSeekBar;
int clickedPos = -1;

protected static class RowViewHolder {
    public TextView fileName;
    public Button filePlay;
    public Button rate;
    public SeekBar fileSeek;
}

public AudioFileListAdapter(Context context, ArrayList<String> fileList,
        String folder) {
    this.fileList = fileList;
    this.context = context;
    this.folder = folder;
    mListView = (ListView) ((Activity) context)
            .findViewById(R.id.Filelistview);

    inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    seekHandler = new Handler();
}

@Override
public int getCount() {
    return fileList.size();
}

@Override
public Object getItem(int position) {
    return fileList.get(position);
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    RowViewHolder viewHolder;
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.audio_file_list_item, null);
        viewHolder = new RowViewHolder();
        viewHolder.fileName = (TextView) convertView
                .findViewById(R.id.file_name);
        viewHolder.filePlay = (Button) convertView
                .findViewById(R.id.file_play);
        viewHolder.filePlay.setTag(position);
        viewHolder.rate = (Button) convertView.findViewById(R.id.rate);
        viewHolder.fileSeek = (SeekBar) convertView
                .findViewById(R.id.file_seek);
        viewHolder.filePlay.setOnClickListener(mListener);
        viewHolder.rate.setOnClickListener(mListener);
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (RowViewHolder) convertView.getTag();
    }

    viewHolder.fileName.setText(fileList.get(position));
    return convertView;
}

OnClickListener mListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        if (v.getId() == R.id.file_play)
        {

            final int position = mListView.getPositionForView((View) v
                    .getParent());
            Log.d("position"+position, "count"+mListView.getCount());
            for (int i = 0 ; i < mListView.getChildCount(); i++) {
                RowViewHolder viewholder = (RowViewHolder) ((View) mListView
                        .getChildAt(i)).getTag();
                if (i == position) {
                    String path = Environment.getExternalStorageDirectory()
                            .toString()
                            + "/analyser/"
                            + folder
                            + "/"
                            + fileList.get(i);
                    mSeekBar = viewholder.fileSeek;

                    Log.d("IN the click "+i,path);
                    // mSeekBar.setEnabled(false);
                    mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

                        @Override
                        public void onStopTrackingTouch(SeekBar seekBar) {
                            // TODO Auto-generated method stub

                        }

                        @Override
                        public void onStartTrackingTouch(SeekBar seekBar) {
                            // TODO Auto-generated method stub

                        }

                        @Override
                        public void onProgressChanged(SeekBar seekBar, int progress,
                                boolean fromUser) {
                            if(mPlayer != null && fromUser){
                                mPlayer.seekTo(progress);
                            }

                        }
                    });
                    viewholder.fileSeek.setVisibility(View.VISIBLE);
                    viewholder.fileName.setVisibility(View.GONE);
                    play(path);
                } else {
                    viewholder.fileSeek.setVisibility(View.GONE);
                    viewholder.fileName.setVisibility(View.VISIBLE);
                }
            }

        }
        if (v.getId() == R.id.rate) {

        }
    }
};

public void play(String path) {
    if (mPlayer == null) {
        mPlayer = new MediaPlayer();
        mPlayer.setOnPreparedListener(new OnPreparedListener() {

            @Override
            public void onPrepared(MediaPlayer mp) {
                mSeekBar.setMax(mPlayer.getDuration());
                mp.start();
                seekUpdation();
            }
        });
        mPlayer.setOnCompletionListener(new OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer mp) {
                mPlayer.release();
                mPlayer = null;
                seekHandler.removeCallbacks(run);

            }
        });

    }

    if (mPlayer.isPlaying()) {
        mPlayer.stop();
        mPlayer.reset();
        seekHandler.removeCallbacks(run);
    }
    try {
        mPlayer.setDataSource(path);
        mPlayer.prepare();
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public Runnable run = new Runnable() {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        if (mPlayer != null) {
            seekUpdation();
        }

    }
};

public void seekUpdation() {
    if (mPlayer != null) {
        mSeekBar.setProgress(mPlayer.getCurrentPosition());
        seekHandler.postDelayed(run, 1000);
    }
}

}

You have to set the listeners for the button in the Adapter class getView method.

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        RowViewHolder viewHolder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.audio_file_list_item, null);
            viewHolder = new RowViewHolder();
            viewHolder.fileName = (TextView) convertView.findViewById(R.id.file_name);
            viewHolder.filePlay = (Button) convertView.findViewById(R.id.file_play);
            viewHolder.filePlay.setOnClickListener(new OnClickListener(){

                  @Override
                  public void onClick(View view){

                  // Do Your Work Here
                  }

            });
            viewHolder.filePlay.setTag(position);
            viewHolder.rate = (Button) convertView.findViewById(R.id.rate);
            viewHolder.fileSeek = (SeekBar) convertView.findViewById(R.id.file_seek);
            viewHolder.filePlay.setOnClickListener(mListener);
            viewHolder.rate.setOnClickListener(mListener);
            convertView.setTag(viewHolder);
    } else {
            viewHolder = (RowViewHolder) convertView.getTag();
}

viewHolder.fileName.setText(fileList.get(position));
return convertView;

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM