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>