【问题标题】:Getting wrong position from view从视图中获取错误的位置
【发布时间】:2017-02-01 09:14:42
【问题描述】:

我有一个列表视图,其中我的歌曲来自列表中的服务,每行都有按钮,即(播放/暂停)按钮。我在完成歌曲时遇到问题,因为如果我的歌曲结束,那么我想执行单击下一行播放按钮,但它执行单击第 4 行按钮。但是如果我增加列表行的高度而不是播放第二个。我也在尝试使用方法 setTag() 和 getTag() 但没有运气。

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

        final Planet planet = (Planet) planetList.get(position);


        viewHolder = null;

        // Create a new row view
        if (convertView == null) {
            viewHolder = new ViewHolder();
            LayoutInflater layoutInflater = (LayoutInflater) contexts.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            convertView = layoutInflater.inflate(R.layout.list_rows_relative, parent, false);

            viewHolder.playbutton = (ImageView) convertView.findViewById(R.id.CheckBox01);

            }
            convertView.setTag(viewHolder);

        } else {

            viewHolder = (ViewHolder) convertView.getTag();

        }

    viewHolder.playbutton.setTag(position_tag);     //position_tag is a int variable


viewHolder.playbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                final int positiont = mainListView.getPositionForView(parentRow);

                    String name = planet.getSong_url();

                    selectedPosition = positiont;
                    position_tag=selectedPosition;
                    position_tag=position_tag+1; // if i use this it gives error on complete button perform click

       position_tag=1; // if i use this then it plays second song perform second button click

        playsong(name);});}



mplayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {

                int hell = position_tag;
                Log.d("position_on",hell+"");  //aFTER 1st SONG COMPLETE these value prints "4" but i need next one  

                    viewHolder.checkBox.findViewById(R.id.CheckBox01).findViewWithTag(position_tag).performClick();
                }
        });

【问题讨论】:

  • 你为什么从 mainListView.getPositionForView() 获取位置。您已经将位置标记为播放按钮。然后您可以从播放按钮获取位置。然后,根据按钮位置单击从列表项中获取歌曲名称。
  • 我也尝试了这些最终的 int position = (Integer) v.getTag();而不是 getPositionForView() ;但是我在播放按钮上执行了很多操作,所以这就是为什么我需要在歌曲完成时执行按钮单击,但是@ahmed 为什么这些代码适用于 android 电视,因为电视列表行的高度更大,而移动设备的行高度较小。有什么想法吗??
  • 还有一件事,Mediaplayer 应该作为服务运行。否则,当您退出应用程序时,播放器将停止播放。
  • 求信息人!!

标签: android listview android-mediaplayer baseadapter


【解决方案1】:

根据你的代码,你应该像下面这样,

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

    final Planet planet = (Planet) planetList.get(position);


    viewHolder = null;

    // Create a new row view
    if (convertView == null) {
        viewHolder = new ViewHolder();
        LayoutInflater layoutInflater = (LayoutInflater) contexts.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        convertView = layoutInflater.inflate(R.layout.list_rows_relative, parent, false);

        viewHolder.playbutton = (ImageView) convertView.findViewById(R.id.CheckBox01);
convertView.setTag(viewHolder);



    } else {

        viewHolder = (ViewHolder) convertView.getTag();

    }

viewHolder.playbutton.setTag(position);     //position_tag is a int variable


 viewHolder.playbutton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            final int positiont = Integer.parseInt(v.getTag().toString());
            PlanetList planet=planetList.get(positiont)
                String name = planet.getSong_url();

                selectedPosition = positiont;
               position_tag=positiont;
    playsong(name);});}



 mplayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
       position_tag=(position_tag+1)
   final Planet planet = (Planet) planetList.get(position_tag);//UPDATED
   mp.setDataSource(planet.getSongUrl());
   mp.start();

            }
    });

更新

创建名为 position_tag 的静态字段,然后在按钮单击时分配第一个位置,当媒体播放器完成时,您可以使用 position_tag 添加 +1,并检查列表项上是否仍然存在位置。然后,将其添加到媒体播放器。将 URL 设置为 MP,然后在 mediaplayer 完成的侦听器上使用相同的引用再次启动 mediaplayer。

注意:您在适配器类中创建 MediaPlayer 对象,当适配器类销毁并重新创建时,重新创建的 mediaplayer 对象将无法在现有的正在播放的媒体文件上工作。

【讨论】:

  • 我尝试了这两个,但结果相同。在媒体完成时,我的位置会自动增加,如果它的 1 然后增加并执行点击第 5 行按钮。
  • 那么,你要做的是,完成第一首歌曲后,它会自动播放下一首歌曲。对吗?例如:如果第一首歌曲正在播放,那么第二首歌曲应该播放正确吗?
  • 是的,我想要这些兄弟。我的第二行按钮从播放变为暂停,播放按钮功能调用,如选取框突出显示。
  • 以及我放入 findViewWithTag(position_tag) 的内容;而不是 postion_tag ?位置!!?
  • 如果有帮助,请不要忘记投票并接受我的回答。
【解决方案2】:

请将一行改成 getView ,应该可以解决你的问题。

 final Planet planet = (Planet)this.getItem(position);

因为当您单击 ListView 项目时,它的给定位置来自可见列表项目大小,而不是按顺序排列的整个大小。

还将下面的行放入您用于设置标签的“if”子句中。因为每次更新标签时都会将其更改为视图,即给定所有工资新位置,而不是在列表视图第一次膨胀时设置的实际位置。

    if (convertView == null) {
        viewHolder = new ViewHolder();
        LayoutInflater layoutInflater = (LayoutInflater) contexts.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        convertView = layoutInflater.inflate(R.layout.list_rows_relative, parent, false);

        viewHolder.playbutton = (ImageView) convertView.findViewById(R.id.CheckBox01);
        convertView.setTag(viewHolder);
        viewHolder.playbutton.setTag(position);     //position is a int variable    
    } else {    
        viewHolder = (ViewHolder) convertView.getTag();
    }

【讨论】:

  • 收到此错误@Chetan : java.lang.Integer 无法转换为 Planet,Plane 是我的 Pojo 类。
  • @Override public Object getItem(int position) { return position;这是我的 getItem。
  • 如果你使用的是 ArrayAdapter 那么 ist 应该给 Planet object ,
  • 然后忽略第一行并查看getView“if”子句,其中我将设置标记线放入“if”子句中,因为每次标记值在您的代码中都会更改。
  • 我正在使用 Base Adapter 和 ArrayList planetList = new ArrayList();这是我的清单。
【解决方案3】:

在您的 viewHolder.playbutton.setOnClickListener 中,您可以使用 viewholder 的 getAdapterPosition() 方法获取被点击项目的位置。在 onClickListener 中,您可以保存该位置,在 onCompletionListener 中只需将此位置增加 1 并从下一行项目播放歌曲。

【讨论】:

  • 是的,先生,我和你说的一样,但我不知道为什么在完整的方法中,我增加的值会自动增加 4 个数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2012-03-11
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多