Android 如何防止单个动画视图被循环使用。回收视图

Android 如何防止单个动画视图被循环使用。回收视图,android,android-recyclerview,Android,Android Recyclerview,我正在构建一个音乐播放器应用程序,并使用RecyclerView。当我从列表中选择歌曲时,文本(songname)开始水平滚动。 如果我然后垂直滚动以查找列表中的其他歌曲,然后滚动回正在播放的歌曲,则水平滚动已停止,这是不需要的 当我按下列表中的一个项目时,我将该视图保存在一个实例变量中(供以后更改歌曲时使用),并设置hasTransientState(true)。 水平滚动的视图(ScrollTextView)是自定义的。 方法playbaussetop在按下项目时被调用 在我看来,adapa

我正在构建一个音乐播放器应用程序,并使用
RecyclerView
。当我从列表中选择歌曲时,文本(songname)开始水平滚动。 如果我然后垂直滚动以查找列表中的其他歌曲,然后滚动回正在播放的歌曲,则水平滚动已停止,这是不需要的

当我按下列表中的一个项目时,我将该视图保存在一个实例变量中(供以后更改歌曲时使用),并设置
hasTransientState(true)
。 水平滚动的视图(ScrollTextView)是自定义的。 方法
playbaussetop
在按下项目时被调用

在我看来,adapater类中的onBindViewHolder似乎被调用,即使我在按下的视图上设置了
hasTransientState(true)

我使用
setHasTransientState(true)
使用常规的
ListView
成功地避免了这个问题 如何使用
RecyclerView
避免此问题? 非常感谢您的帮助

public class TrackListFragment extends Fragment {

    private Context mContext;
    private RecyclerView mRecyclerView;
    private TrackAdapter mTrackAdapter;
    private IPlayer mPlayer;
    private int mCurrentTrack = -1;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mContext = context;
        mPlayer = new Player(context);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view =  inflater.inflate(R.layout.recycler_view_layout, container, false);
        mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);

    //mRecyclerView.getRecycledViewPool().setMaxRecycledViews(0, 3);

        Bundle bundle = getArguments();
        ArrayList<Track> tracks = null;
        if (bundle != null) {
             tracks = bundle.getParcelableArrayList("Tracks");
        }

         mTrackAdapter = new TrackAdapter(tracks, mContext);

         RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(mContext);
         mRecyclerView.setLayoutManager(mLayoutManager);
         mRecyclerView.setAdapter(mTrackAdapter);

         mRecyclerView.addOnItemTouchListener(new RecyclerTouchListener(mContext, mRecyclerView, new RecyclerTouchListener.IClickListener() {
        @Override
        public void onClick(View view, int position) {
            playPauseStop(view, position);
        }

        @Override
        public void onLongClick(View view, int position) {

        }
    }));
    return view;
}

private ScrollTextView mStv;
private RelativeLayout mRelativeLayout;

/**
 * mCurrentTrack is initially -1,
 * and set to -1 when media player is stopped.
 * @param position
 */
public void playPauseStop(View view, int position) {

    int firstViewItemIndex = ((LinearLayoutManager)mRecyclerView.getLayoutManager()).findFirstVisibleItemPosition();
    int screenIndex = position - firstViewItemIndex;

    ScrollTextView stv = null;
    RelativeLayout relativeLayout = (RelativeLayout)mRecyclerView.getChildAt(screenIndex);


    for(int i = 0; i < 2; i++) {
        if(relativeLayout.getChildAt(i) instanceof ScrollTextView) {
            stv = (ScrollTextView) relativeLayout.getChildAt(i);
        }
    }

        if(mCurrentTrack == position && mPlayer.isPlaying()) {
            mPlayer.pause();
            stv.pauseScroll();
        } else if(mCurrentTrack == position && !mPlayer.isPlaying()) {
            // Start after pause
            mPlayer.play();
            stv.resumeScroll();
        } else if(mCurrentTrack != position && mPlayer.isPlaying()) {
            // Stop playing track
            mPlayer.stop();

            // Start new track
            mPlayer = new Player(mContext);
            String itemData = mTrackAdapter.getItem(position);
            mPlayer.startPlayThread(itemData);

            mStv.stopScrolling();
            mStv.setTextColor(Color.BLUE);
            mRelativeLayout.setHasTransientState(false);

            mStv = stv;

            stv.startScroll();
            stv.setTextColor(Color.RED);
            relativeLayout.setHasTransientState(true);
            mRelativeLayout = relativeLayout;
            mCurrentTrack = position;
       }

       if(mCurrentTrack == -1) { // Initial. Start first track.
            mStv = stv;

            mCurrentTrack = position;
            String itemData = mTrackAdapter.getItem(position);
            mPlayer.startPlayThread(itemData);
            stv.startScroll();
            stv.setTextColor(Color.RED);

            relativeLayout.setHasTransientState(true);
            mRelativeLayout = relativeLayout;
            //mRelativeLayout.setHasTransientState(true);
        }
    }

}
公共类TrackListFragment扩展了片段{
私有上下文;
私人回收视图mRecyclerView;
专用轨道适配器mTrackAdapter;
私有IPlayer-mPlayer;
私有int mCurrentTrack=-1;
@凌驾
公共void-onAttach(上下文){
super.onAttach(上下文);
mContext=上下文;
mPlayer=新玩家(上下文);
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图=充气机。充气(R.layout.recycler\u视图\u布局,容器,错误);
mRecyclerView=(RecyclerView)view.findviewbyd(R.id.recycler\u视图);
//mRecyclerView.getRecycledViewPool().setMaxRecycledViews(0,3);
Bundle=getArguments();
ArrayList tracks=null;
if(bundle!=null){
tracks=bundle.getParcelableArrayList(“tracks”);
}
mTrackAdapter=新的TrackAdapter(曲目、mContext);
RecyclerView.LayoutManager mLayoutManager=新的LinearLayoutManager(mContext);
mRecyclerView.setLayoutManager(mllayoutmanager);
mRecyclerView.setAdapter(mtrackapter);
addOnItemTouchListener(新的RecyclerTouchListener(mContext,mRecyclerView,新的RecyclerTouchListener.IClickListener()){
@凌驾
公共void onClick(视图,int位置){
播放暂停停止(视图、位置);
}
@凌驾
仅长按公共无效(视图,int位置){
}
}));
返回视图;
}
私人滚动文本查看mStv;
私人关系的相关布局;
/**
*McCurrentTrack最初为-1,
*并在媒体播放器停止时设置为-1。
*@param位置
*/
公共无效播放暂停停止(视图,int位置){
int firstViewItemIndex=((LinearLayoutManager)mrecyclView.getLayoutManager()).FindFirstViewItemIndex();
int screenIndex=位置-firstViewItemIndex;
ScrollTextView stv=null;
RelativeLayout RelativeLayout=(RelativeLayout)mRecyclerView.getChildAt(屏幕索引);
对于(int i=0;i<2;i++){
if(relativeLayout.getChildAt(i)ScrollTextView实例){
stv=(ScrollTextView)relativeLayout.getChildAt(i);
}
}
if(mcurrentrack==位置和mPlayer.isPlaying()){
mPlayer.pause();
stv.pauseScroll();
}else if(mCurrentTrack==位置&&!mPlayer.isPlaying()){
//暂停后开始
mPlayer.play();
stv.resumeScroll();
}else if(mcurrentrack!=位置和mPlayer.isPlaying()){
//停止播放曲目
mPlayer.stop();
//开始新的轨道
mPlayer=新播放器(mContext);
String itemData=mTrackAdapter.getItem(位置);
mPlayer.startPlayThread(itemData);
mStv.stopScrolling();
mStv.setTextColor(Color.BLUE);
mrRelativeLayout.setHasTransientState(false);
mStv=stv;
stv.startScroll();
stv.setTextColor(颜色为红色);
relativeLayout.setHasTransientState(真);
mrrelativelayout=相对长度;
mCurrentTrack=位置;
}
如果(mCurrentTrack==-1){//Initial.开始第一个曲目。
mStv=stv;
mCurrentTrack=位置;
String itemData=mTrackAdapter.getItem(位置);
mPlayer.startPlayThread(itemData);
stv.startScroll();
stv.setTextColor(颜色为红色);
relativeLayout.setHasTransientState(真);
mrrelativelayout=相对长度;
//mrrelativelayout.setHasTransientState(true);
}
}
}
我的适配器:

public class TrackAdapter extends RecyclerView.Adapter<TrackAdapter.MyViewHolder> {

private List<Track> mTracks;
private Context mContext;

public class MyViewHolder extends RecyclerView.ViewHolder {

        public TextView mTitle, mArtist;
        public ScrollTextView mScrollTextView;

        public MyViewHolder(View view) {
             super(view);
             mScrollTextView = (ScrollTextView) view.findViewById(R.id.scroll_track);
             mArtist = (TextView) view.findViewById(R.id.track_artist);
             mTitle =  (TextView) view.findViewById(R.id.track_duration);
        }

    }

    public TrackAdapter(List<Track> tracks, Context context) {
         mContext = context;
         mTracks = tracks;
    }

    public String getItem(int position) {
          return mTracks.get(position).getLocation();
    }

    @Override
    public TrackAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
         View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.track_list_layout, parent, false);
         return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(TrackAdapter.MyViewHolder holder, int position) {
         Track track = mTracks.get(position);
         holder.mScrollTextView.setTextColor(Color.BLUE);
         holder.mScrollTextView.setBackgroundColor(Color.BLACK);
         holder.mScrollTextView.setVisibility(View.VISIBLE);
         holder.mScrollTextView.setText(track.getTitle());
         holder.mArtist.setText(track.getArtist());
        //holder.setIsRecyclable(false);
    }

    @Override
    public int getItemCount() {
        return mTracks.size();
    }

    @Override
    public long getItemId(int i) {
         return i;
    }
}
公共类TrackAdapter扩展了RecyclerView.Adapter{ 私人名单; 私有上下文; 公共类MyViewHolder扩展了RecyclerView.ViewHolder{ 公共文本视图mTitle,mArtist; 公共滚动文本视图mScrollTextView; 公共MyViewHolder(视图){ 超级(视图); mScrollTextView=(ScrollTextView)view.findViewById(R.id.scroll\u轨迹); mArtist=(TextView)view.findViewById(R.id.track\u artist); mTitle=(TextView)view.findViewById(R.id.track\u duration); } } 公共轨迹适配器(列表轨迹、上下文){ mContext=上下文; mTracks=轨道; } 公共字符串getItem(int位置){ 返回mTracks.get(position.getLocation(); } @凌驾 public TrackAdapter.MyViewHolder onCreateViewHolder(视图组父级,int-viewType){ View itemView=LayoutFlater.from(parent.getContext()).flate(R.layout.track\u list\u布局,parent,false); 返回新的MyViewHolder(itemView); } @凌驾 public void onBindViewHolder(TrackAdapter.MyViewHolder holder,int posi
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:showIn="@layout/activity_main"
    tools:context=".MainActivity">

    <android.support.v7.widget.RecyclerView
         android:id="@+id/recycler_view"
         android:scrollbars="vertical"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />

</LinearLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_height="wrap_content">

<package.name.custom.ScrollTextView
    android:id="@+id/scroll_track">

</package.name.custom.ScrollTextView>

    <TextView
        android:id="@+id/track_artist"
        android:layout_below="@id/scroll_track"
         />

    <TextView
        android:id="@+id/track_duration"
         />

</RelativeLayout>