2016-12-14 58 views
0

我见过很多类似这个问题的帖子,但我仍然无法弄清楚这一点。我使用自定义baseadapter和自定义listfragment创建了一个简单的mediaplayer。每个listview都包含一个自定义textview,它会在按下文本时对文本开始动画(水平滚动)。Android Baseadaper。 getView被调用的次数太少

getCount()baseadapter返回baseadapter(size == 11)正确的大小,但getView()adapter设置只叫10倍。

目前,我的屏幕配置了九个列表项。当我按下顶部项目时,水平滚动开始并播放一首歌曲。如果我然后向上滚动查看最后一个项目,那个项目也开始了动画,这不是我想要的。

有人有类似的问题,可以帮助我呢?

我试图在getView()中以不同的方式更新视图,但动画仍然存在。对我而言,问题似乎是getView()最初只是叫做getCount() - 1次。

public class ListViewFragment extends ListFragment { 

    private Context mContext; 
    private MyBaseAdapter mBaseAdapter; 
    private MyListViewListener mListViewListener; 
    private String mJsonStr; 
    private IPlayer mPlayer; 
    private int mCurrentTrack = -1; 

    public interface MyListViewListener { 
     void getListItemData(String str); 
    } 

    public static ListViewFragment newInstance() { 
     return new ListViewFragment(); 
    } 

    public ListViewFragment() { 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     mContext = context; 
     mPlayer = new package.name.Player(context); 
     if(context instanceof MainActivity) { 
      mListViewListener = (ListViewFragment.MyListViewListener) context; 
     } else { 
      throw new ClassCastException(context.toString() + " must implement IEditTextListener"); 
     } 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.layout_listviewfragment, container, false); 
     mJsonStr = getArguments().getString("MainActivity"); 

     Gson gson = new Gson(); 
     List<Track> tracks = gson.fromJson(mJsonStr, new TypeToken<List<Track>>(){}.getType()); 

     mBaseAdapter = new MyBaseAdapter(mContext, tracks); 
     setListAdapter(mBaseAdapter); 

     return view; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 
     playPauseStop(position); 
    } 

    private ScrollTextView mStv; 

    public void playPauseStop(int position) { 

     int firstViewItemIndex = getListView().getFirstVisiblePosition(); 
     int viewIndex = position - firstViewItemIndex; 
     ScrollTextView stv = (ScrollTextView) getListView().getChildAt(viewIndex); 

     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()) { 
      // Change track 

      mPlayer.stop(); 
      mPlayer = new Player(mContext); 
      String itemData = (String) mBaseAdapter.getItem(position); 
      mPlayer.startPlayThread(itemData); 
      mStv.stopScrolling(); 
      mStv.setTextColor(Color.BLUE); 
      mStv = stv; 

      stv.startScroll(); 
      stv.setTextColor(Color.RED); 

      mCurrentTrack = position; 
     } 

     if(mCurrentTrack == -1) { // Initial. Start first track. 
      mStv = stv;   // Keep track of view. Needed to stop horizontal scrolling when changing track if view is off screen. 

      mCurrentTrack = position; 

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

     } 
    } 
} 


public class MyBaseAdapter extends BaseAdapter { 

    private Context mContext; 
    private Typeface mTypeface; 
    private List<Track> mTracks; 

    public MyBaseAdapter(Context context, List<Track> tracks) { 
     super(); 
     mContext = context; 
     mTypeface = Typeface.createFromAsset(mContext.getAssets(), "fonts/specialfont.ttf"); 
     mTracks = tracks; 
    } 

    @Override 
    public int getCount() { // Returns the correct size 
     return mTracks.size(); 
    } 

    @Override 
    public Object getItem(int i) { 
     return mTracks.get(i).getLocation(); // track-URI 
    } 

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

    private ViewHolder mViewHolder; 
    static class ViewHolder { 
     ScrollTextView mTextView; 
    } 

    @Override 
    public View getView(int position, View view, ViewGroup viewGroup) { 
     if (view == null) { 
      LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = inflater.inflate(R.layout.layout_list_item, null); 

      mViewHolder = new ViewHolder(); 
      mViewHolder.mTextView = (ScrollTextView) view.findViewById(R.id.scroll_text); 
      mViewHolder.mTextView.setTypeface(mTypeface); 
      mViewHolder.mTextView.setTextColor(Color.BLUE); 
      mViewHolder.mTextView.setBackgroundColor(Color.BLACK); 
      mViewHolder.mTextView.setVisibility(View.VISIBLE); 

      // store the holder with the view. 
      view.setTag(mViewHolder); 
     } else { // Avoid calling findViewById() when scrolling 
      mViewHolder = (ViewHolder) view.getTag(); 
     } 

     mViewHolder.mTextView.setText(mTracks.get(position).getArtist() + " : " + mTracks.get(position).getName()); 

     return view; 
    } 

} 

layout_listviewfragment.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <ListView 
     android:id="@android:id/list" 
     android:layout_height="match_parent" 
     android:layout_width="match_parent"> 
    </ListView> 
</LinearLayout> 

layout_list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<package.name.ScrollTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/scroll_text" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:textSize="72sp"> 
</package.name.ScrollTextView> 
+0

AFAIK'getView()'仅针对要显示的项目调用。它不要求您的列表的总大小。其他项目将在您滚动列表时创建,并显示该行。 – DroidDev

+0

好吧,但最初显示九个项目,但getView()被称为十次。 – datamoose

回答

相关问题