2016-07-28 45 views
0

目的试图改变的ImageButton的背景列表项

我想在列表项的点击用的ImageButton(最初是隐藏的,在点击可见),显示播放暂停(2个图像)资源播放声音。 ImageButton只是向用户显示声音的状态。

问题

当我滚动列表,ImageButton的再次消失了。

代码

BaseAdapter

private class ListAdapter extends BaseAdapter { 
    private Context mContext; 
    private LayoutInflater mInflater; 
    ViewHolder holder; 

    ListAdapter(Context context) { 
     mContext = context; 
     this.mInflater = LayoutInflater.from(mContext); 

    } 

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

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

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      holder = new ViewHolder(); 
      convertView = mInflater.inflate(R.layout.dua_row, null); 
      holder.mainBg = (RelativeLayout) convertView.findViewById(R.id.duaBG); 
      holder.title_text = (TextView) convertView.findViewById(R.id.title_text); 
      holder.buttonPlayPause = (ImageButton) convertView.findViewById(R.id.imageButton); 
      holder.buttonPlayPause.setFocusable(false); 
      holder.buttonPlayPause.setFocusableInTouchMode(false); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     String leftRemoved = indexTitles.get(position).trim(); 
     holder.title_text.setText(leftRemoved); 
     // /player selection 
     if (playPos == position) { 
      holder.buttonPlayPause.setBackgroundResource(R.drawable.buttonpause); 
      holder.mainBg.setBackgroundColor(Color.parseColor("#000000")); 
      holder.title_text.setTextColor(Color.parseColor("#D59D52")); 
     } else { 
      holder.buttonPlayPause.setVisibility(View.GONE); 
      holder.title_text.setTextColor(Color.parseColor("#000000")); 
      holder.mainBg.setBackgroundColor(Color.parseColor("#D59D52")); 
     } 
     return convertView; 
    } 

列表行

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:layout_margin="@dimen/activity_horizontal_margin" 
android:id="@+id/duaBG" 
android:background="#D59D52"> 

<TextView 
    android:layout_width="match_parent" 
    android:layout_height="32dp" 
    android:text="" 
    android:textSize="18dp" 
    android:id="@+id/title_text" 
    android:ellipsize="end" 
    android:maxLines="1" 

    android:layout_alignParentTop="true" 
    android:layout_marginLeft="@dimen/activity_horizontal_margin" 
    android:layout_marginTop="@dimen/activity_horizontal_margin" 
    android:layout_marginBottom="@dimen/activity_horizontal_margin" 
    android:layout_toLeftOf="@+id/imageButton" 
    android:layout_toStartOf="@+id/imageButton" /> 

<ImageButton 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/imageButton" 
    android:focusable="false" 
    android:visibility="gone" 
    android:background="@drawable/buttonpause" 
    android:layout_centerVertical="true" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true" /> 

<LinearLayout 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="5dp" 
    android:background="#000000" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true"></LinearLayout> 

OnItemClickListener

// indexTitles is ArrayList<String> 
    indexTitles = getIndexTitles(); 
    final ListAdapter adapter = new ListAdapter(this); 
    listView.setAdapter(adapter); 
    listView.setOnItemClickListener(new OnItemClickListener() { 


     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      final View v = view.findViewById(R.id.imageButton); 
      v.setVisibility(View.VISIBLE); 

      if (mediaPlayer.isPlaying() && playPos == position) { 
       // pause mediaplayer 
       mediaPlayer.pause(); 
       MEDIA_PAUSED = true; 
       v.setBackgroundResource(R.drawable.buttonplay); 

      } else if (MEDIA_PAUSED && !mediaPlayer.isPlaying() && playPos == position) { 
       MEDIA_PAUSED = false; 
       mediaPlayer.start(); 
       v.setBackgroundResource(R.drawable.buttonpause); 
      } else if (!mediaPlayer.isPlaying() || mediaPlayer.isPlaying() && playPos != position) { 
       // release and start from this position 
       mediaPlayer.reset(); 
       v.setVisibility(View.VISIBLE); 
       v.setBackgroundResource(R.drawable.buttonpause); 
       String s = String.format("%03d", position + 2); 
       String Path = SDCARD_PATH + "/DoaData/DD_" + s + ".mp3"; 
       playPos = position; 
       adapter.notifyDataSetChanged(); 
       File file = new File(Path); 
       Uri uri = Uri.fromFile(file); 
       try { 
        mediaPlayer.setDataSource(context, uri); 
        mediaPlayer.prepare(); 
        mediaPlayer.start(); 
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
         @Override 
         public void onCompletion(MediaPlayer mp) { 
          v.setBackgroundResource(R.drawable.buttonplay); 
         } 
        }); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }); 

需要什么 我想的ImageButton以保持其状态有关正在播放或暂停。

感谢

+0

什么是playPos?你在哪里得到那 – DKV

+0

add'holder.buttonPlayPause.setVisibility(View.VISIBLE);'在if语句时'playPos == position'获取更多信息:http://stackoverflow.com/questions/11945563/how-listviews-回收机制 - 作品 –

+0

@VV playPos是int来自onClick的位置... – Kamran

回答

0

只需设置IF语句中的知名度是这样的:

if (playPos == position) {   
     holder.buttonPlayPause.setVisibility(View.VISIBLE); 
     // further implementation 
    } else { 
     holder.buttonPlayPause.setVisibility(View.GONE); 
     // further implementation 
    } 

的问题发生,因为列表适配器回收旧的观点。当一个视图不可见并且列表正在使用旧视图创建新视图时,必须重新设置每个不同的属性,否则将返回/重用先前视图对象中的所有属性。

0

我都做到了,借助@Thomas和@shayan

这是我改变了我的代码来获得我需要什么

 @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      holder = new ViewHolder(); 
      convertView = mInflater.inflate(R.layout.dua_row, null); 
      holder.mainBg = (RelativeLayout) convertView.findViewById(R.id.duaBG); 
      holder.title_text = (TextView) convertView.findViewById(R.id.title_text); 
      holder.buttonPlayPause = (ImageButton) convertView.findViewById(R.id.imageButton); 
      holder.buttonPlayPause.setFocusable(false); 
      holder.buttonPlayPause.setFocusableInTouchMode(false); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     String leftRemoved = indexTitles.get(position).trim(); 
     holder.title_text.setText(leftRemoved); 
     // /player selection 
     if (playPos == position) { 
      if(MEDIA_PAUSED){ 
       holder.buttonPlayPause.setBackgroundResource(R.drawable.buttonplay); 
      } else if(!MEDIA_PAUSED) { 
       holder.buttonPlayPause.setBackgroundResource(R.drawable.buttonpause); 
      } 

      holder.mainBg.setBackgroundColor(Color.parseColor("#000000")); 
      holder.title_text.setTextColor(Color.parseColor("#D59D52")); 
      holder.buttonPlayPause.setVisibility(View.VISIBLE); 
     } else { 
      holder.buttonPlayPause.setVisibility(View.GONE); 
      holder.title_text.setTextColor(Color.parseColor("#000000")); 
      holder.mainBg.setBackgroundColor(Color.parseColor("#D59D52")); 
     } 
     return convertView; 
    } 

,改变了onItemClick()这样的

try { 
        mediaPlayer.setDataSource(context, uri); 
        mediaPlayer.prepare(); 
        mediaPlayer.start(); 
        MEDIA_PAUSED = false; 

        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
         @Override 
         public void onCompletion(MediaPlayer mp) { 
          v.setBackgroundResource(R.drawable.buttonplay); 
          getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

         } 
        }); 
+0

希望它可以帮助某人...... – Kamran