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

Android 在GridLayout中单击视图时重置上次单击视图的图标,android,listview,android-gridview,Android,Listview,Android Gridview,我正在开发一个音乐播放应用程序,但在过去的两天里我一直在修复一个bug。基本上,用户可以添加一个新视图,随意命名,并选择一个mp3文件链接到该视图 正如您所看到的,每个视图都有一个文本,上面有一个小的播放图标。播放音频时,此图标切换为暂停图标 第1期: 当用户启动一个声音,然后单击另一个方块时,前一个声音停止,新的声音开始,但旧方块的图标保持暂停图标,因此在屏幕上,最终许多方块会有暂停图标,而实际上不会播放声音 问题2:假设用户单击绝对第一个正方形,它在arrayList中对应于位置0。然后用户

我正在开发一个音乐播放应用程序,但在过去的两天里我一直在修复一个bug。基本上,用户可以添加一个新视图,随意命名,并选择一个mp3文件链接到该视图

正如您所看到的,每个视图都有一个文本,上面有一个小的播放图标。播放音频时,此图标切换为暂停图标

第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;
    }

}
公共类GridItemAdapter扩展了ArrayAdapter{
私有静态最终字符串LOG_TAG=GridItemAdapter.class.getSimpleName();
公共GridItemAdapter(活动上下文,ArrayList gridItems){
//这里,我们为上下文和列表初始化ArrayAdapter的内部存储。
//第二个参数在ArrayAdapter填充单个TextView时使用。
//因为这是两个TextView和一个ImageView的自定义适配器,所以适配器不是
//我们将使用第二个参数,所以它可以是任何值。
超级(上下文,0,gridItems);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//检查现有视图是否正在重新使用,否则会膨胀视图
View gridItemView=convertView;
如果(gridItemView==null){
gridItemView=LayoutInflater.from(getContext()).flate(
R.layout.grid_项,父项,false);
}
//获取位于列表中此位置的{@link AndroidFlavor}对象
GridItem currentGridItem=getItem(位置);
//在list_item.xml布局中查找ID版本名称为的TextView
TextView name TextView=(TextView)gridItemView.findViewById(R.id.text_1);
//在名称TextView上设置此文本
nameTextView.setText(currentGridItem.getSoundName());
ImageView播放图标=(ImageView)gridItemView.findViewById(R.id.image_1);
playIcon.setImageResource(R.drawable.play_ic);
//返回整个列表项布局(包含两个TextView和一个ImageView)
//以便可以在ListView中显示它
返回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;
        }
    
    
    
    } 
    
    gridView.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
    @凌驾
    公共无效onItemClick(AdapterView AdapterView、View视图、int i、long l){
    /*
    如果(最后位置!=-1){
    Log.v(TAG3,“Inisde if block,lastposition=“+lastposition”);
    //不管你在找什么职位
    int firstPosition=gridView.getFirstVisiblePosition();
    int wantedChild=lastPosition-firstPosition;
    View wantedView=gridView.getChildAt(wantedChild);
    Log.v(TAG3,“lastRow已启动,lastRow=“+wantedView”);
    ImageView=(ImageView)wantedView.findViewById(R.id.image_1);
    lastIc.setImageResource(R.drawable.play_ic);
    }
    */
    切换播放(i,视图);
    lastPosition=i;
    Log.v(TAG3,“外部if块,lastPosition=“+lastPosition”);
    }
    });
    公共无效切换播放(int i,视图v){
    最终视图=v;
    如果(!显示){
    释放MediaPlayer();
    ImageView playIc=(ImageView)view.findViewById(R.id.image_1);
    playIc.setImageResource(R.drawable.pause_ic);
    GridItem word=gridItems.get(i);
    试一试{
    mMediaPlayer=MediaPlayer.create(MainActivity.this,Uri.parse(word.getSoundPath());
    }捕获(IllegalArgumentException e){
    e、 printStackTrace();
    }
    mmediplayer.start();
    isplay=true;
    mmediplayer.setOnCompletionListener(新的MediaPlayer.OnCompletionListener(){
    @凌驾
    完成时的公共作废(MediaPlayer MediaPlayer){
    释放MediaPlayer();
    ImageView playIc=(ImageView)view.findViewById(R.id.image_1);
    playIc.setImageResource(R.drawable.play_ic);
    isplay=false;
    }
    });
    }否则{
    释放MediaPlayer();
    ImageView playIc=(ImageView)view.findViewById(R.id.image_1);
    playIc.setImageResource(R.drawable.play_ic);
    isplay=false;
    }
    } 
    

这里是一个实现它的简单方法(由于代码段尚未提供,所以我没有阅读您的代码,下面使用的变量是自解释的):

  • 首先在gridview中的项的模型类中添加一个标记,如
    isPlaying

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

    if(itemList.get(index.isplay){
    //将图标设置为暂停一次
    }否则{
    //将图标设置为播放一个
    }

  • 现在,在视图的click listener中,添加以下内容

    if(itemList.get(index.isplay){
    //编写暂停当前歌曲的代码
    }否则{
    //暂停你的歌
    //游戏项目
    itemList.get(index).isplay=true;
    项目