package io.github.mthli.Tweetin.Fragment.TweetList; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.widget.SwipeRefreshLayout; import android.view.View; import android.widget.AbsListView; import android.widget.AdapterView; import io.github.mthli.Tweetin.Flag.FlagUnit; import io.github.mthli.Tweetin.Fragment.Base.ListFragment; import io.github.mthli.Tweetin.R; import io.github.mthli.Tweetin.Task.TweetList.MentionFirstTask; import io.github.mthli.Tweetin.Task.TweetList.MentionMoreTask; import io.github.mthli.Tweetin.Tweet.Tweet; import io.github.mthli.Tweetin.Tweet.TweetAdapter; import java.util.ArrayList; import java.util.List; public class MentionFragment extends ListFragment { private TweetAdapter tweetAdapter; public TweetAdapter getTweetAdapter() { return tweetAdapter; } private List<Tweet> tweetList = new ArrayList<Tweet>(); public List<Tweet> getTweetList() { return tweetList; } private int previousPosition = 0; public void setPreviousPosition(int previousPosition) { this.previousPosition = previousPosition; } private MentionFirstTask mentionFirstTask; private MentionMoreTask mentionMoreTask; private int loadTaskStatus = FlagUnit.TASK_IDLE; public void setLoadTaskStatus(int loadTaskStatus) { this.loadTaskStatus = loadTaskStatus; } private int nextPage = 2; public int getNextPage() { return nextPage; } public void setNextPage(int nextPage) { this.nextPage = nextPage; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); initUI(); mentionFirstTask = new MentionFirstTask(this, false); mentionFirstTask.execute(); } private void initUI() { swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { if (!isSomeLoadTasksRunning()) { mentionFirstTask = new MentionFirstTask(MentionFragment.this, true); mentionFirstTask.execute(); } } }); tweetAdapter = new TweetAdapter(this, R.layout.tweet, tweetList); listView.setAdapter(tweetAdapter); tweetAdapter.notifyDataSetChanged(); listView.setOnScrollListener(new AbsListView.OnScrollListener() { private boolean moveToBottom = false; private int previousFirst = 0; private int currentFirst = 0; private int currentCount = 0; @Override public void onScrollStateChanged(AbsListView absListView, int scrollState) { if (scrollState == SCROLL_STATE_IDLE && (previousPosition < currentFirst || previousPosition > currentFirst + currentCount)) { tweetList.get(previousPosition).setDetail(false); tweetAdapter.notifyDataSetChanged(); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (previousFirst < firstVisibleItem) { moveToBottom = true; } if (previousFirst > firstVisibleItem) { moveToBottom = false; } previousFirst = firstVisibleItem; currentFirst = firstVisibleItem; currentCount = visibleItemCount; if (totalItemCount > 7 && totalItemCount == firstVisibleItem + visibleItemCount && moveToBottom && !isSomeLoadTasksRunning()) { mentionMoreTask = new MentionMoreTask(MentionFragment.this); mentionMoreTask.execute(); } } }); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int currentPosition, long id) { if (previousPosition == currentPosition) { tweetList.get(currentPosition).setDetail(!tweetList.get(currentPosition).isDetail()); } else { tweetList.get(previousPosition).setDetail(false); tweetList.get(currentPosition).setDetail(true); } tweetAdapter.notifyDataSetChanged(); previousPosition = currentPosition; } }); } public boolean isSomeLoadTasksRunning() { return loadTaskStatus == FlagUnit.TASK_RUNNING; } public void getLatestMentions() { if (!isSomeLoadTasksRunning()) { mentionFirstTask = new MentionFirstTask(this, true); mentionFirstTask.execute(); } } public void cancelAllTasks() { if (mentionFirstTask != null && mentionFirstTask.getStatus() == AsyncTask.Status.RUNNING) { mentionFirstTask.cancel(true); } if (mentionMoreTask != null && mentionMoreTask.getStatus() == AsyncTask.Status.RUNNING) { mentionMoreTask.cancel(true); } cancelProfileTask(); } }