我见过很多类似这个问题的帖子,但我仍然无法弄清楚这一点。我使用自定义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>
AFAIK'getView()'仅针对要显示的项目调用。它不要求您的列表的总大小。其他项目将在您滚动列表时创建,并显示该行。 – DroidDev
好吧,但最初显示九个项目,但getView()被称为十次。 – datamoose