单击GridLayout中的视图时,重置上次单击视图的图标

时间:2016-07-11 18:19:36

标签: android listview android-gridview

我正在开发一个音乐播放应用程序,但我一直坚持修复过去两天的错误。 Here is a screenshot of the app.基本上用户可以添加新视图,按照自己的意愿命名,并选择一个mp3文件链接到该视图。

正如您所看到的,每个视图都有一个带有一点播放图标的文本。播放音频时,此图标会切换为暂停图标。 Here you can see the pause icon.

问题1: 当用户启动声音然后点击另一个方块时,前一个声音停止,新声音开始,但旧方块的图标保持暂停图标,所以在屏幕上最终有很多方块会有暂停图标实际上并没有播放声音。

问题2:假设用户点击绝对第一个方块,其在arrayList中对应于位置0.然后用户向下滚动到他点击的方块不再可见的点。当用户再次向上滚动时,他点击的正方形将设置播放图标,同时播放声音。我想这是因为在我的GridAdapter中我设置了每个新显示的视图都有播放图标,我无法弄清楚如何设置if语句。适配器应该如何知道盒子播放声音?

非常感谢和爱。

GridItemAdapter.java:

public class GridItemAdapter extends ArrayAdapter<GridItem> {

    private static final String LOG_TAG = GridItemAdapter.class.getSimpleName();


    public GridItemAdapter(Activity context, ArrayList<GridItem> gridItems) {
        // Here, we initialize the ArrayAdapter's internal storage for the context and the list.
        // the second argument is used when the ArrayAdapter is populating a single TextView.
        // Because this is a custom adapter for two TextViews and an ImageView, the adapter is not
        // going to use this second argument, so it can be any value. Here, we used 0.
        super(context, 0, gridItems);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // Check if the existing view is being reused, otherwise inflate the view
        View gridItemView = convertView;
        if(gridItemView == null) {
            gridItemView = LayoutInflater.from(getContext()).inflate(
                    R.layout.grid_item, parent, false);
        }

        // Get the {@link AndroidFlavor} object located at this position in the list
        GridItem currentGridItem = getItem(position);

        // Find the TextView in the list_item.xml layout with the ID version_name
        TextView nameTextView = (TextView) gridItemView.findViewById(R.id.text_1);
        // set this text on the name TextView
        nameTextView.setText(currentGridItem.getSoundName());

        ImageView playIcon = (ImageView) gridItemView.findViewById(R.id.image_1);

        playIcon.setImageResource(R.drawable.play_ic);




        // Return the whole list item layout (containing 2 TextViews and an ImageView)
        // so that it can be shown in the ListView
        return gridItemView;
    }

}
  • 感兴趣的MainActivity.java片段:

    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
    
                /*
                if (lastPosition != -1) {
                    Log.v(TAG3, "Inisde if block, lastposition = " + lastPosition);
                    // Whatever position you're looking for
                    int firstPosition = gridView.getFirstVisiblePosition();
                    int wantedChild = lastPosition - firstPosition;
                    View wantedView = gridView.getChildAt(wantedChild);
    
                    Log.v(TAG3, "lastRow initiated, lastrow = " + wantedView);
                    ImageView lastIc = (ImageView) wantedView.findViewById(R.id.image_1);
                    lastIc.setImageResource(R.drawable.play_ic);
    
                }
                */
    
                togglePlayback(i, view);
                lastPosition = i;
                Log.v(TAG3, "outside if block, lastPosition = " + lastPosition);
            }
        });
    
    public void togglePlayback(int i, View v){
        final View view = v;
    
        if(!isPlaying) {
            releaseMediaPlayer();
    
            ImageView playIc = (ImageView) view.findViewById(R.id.image_1);
            playIc.setImageResource(R.drawable.pause_ic);
            GridItem word = gridItems.get(i);
    
    
            try {
                mMediaPlayer = MediaPlayer.create(MainActivity.this, Uri.parse(word.getSoundPath()));
            }catch (IllegalArgumentException e){
                e.printStackTrace();
            }
            mMediaPlayer.start();
            isPlaying = true;
    
            mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mediaPlayer) {
                    releaseMediaPlayer();
                    ImageView playIc = (ImageView) view.findViewById(R.id.image_1);
                    playIc.setImageResource(R.drawable.play_ic);
                    isPlaying = false;
                }
            });
        }else{
            releaseMediaPlayer();
            ImageView playIc = (ImageView) view.findViewById(R.id.image_1);
            playIc.setImageResource(R.drawable.play_ic);
            isPlaying = false;
        }
    
    
    
    } 
    

1 个答案:

答案 0 :(得分:0)

这是一种实现它的简单方法(由于尚未提供代码片段,我还没有完成您的代码,下面使用的变量是不言自明的):

  1. 首先在gridview的项目的模型类中添加一个标记isPlaying

  2. 现在在getView方法中,添加以下代码

    if(itemList.get(index).isPlaying) { //set the icon to pause one } else { //set the icon to playing one }

  3. 现在,在视图的点击监听器中,添加此

    if(itemList.get(index).isPlaying) { // write the code to pause the current song } else { // pause your <previousIndex> song // play <index> item itemList.get(index).isPlaying = true; itemList.get(previousIndex).isPlaying = false; previousIndex = index; notifyDataSetChanged(); }

  4. 我刚刚编写了基本逻辑,你需要编写有关播放/暂停歌曲的代码。 希望这会对你有所帮助。