2016-08-02 24 views
1

Ich entwickle eine App (twitter-like) und mein Feed basiert auf einem ListView + Adapter. Standardmäßig erhalten Sie die ersten 20 Elemente Ihrer Feeds. Wenn Sie nach unten scrollen und das Ende der Liste erreichen, sendet das Fragment, das die Ansicht enthält, eine Anfrage an Twitter, um die verbleibenden Feeds zu erhalten List Handle durch den Adapter und senden Sie die Daten Benachrichtigung geändert. Der Gesamtprozess funktioniert aber ich habe ein aber am Ende der Liste.ArrayList doppeltes Element in der Listenansicht angezeigt

Wenn Sie das Ende der Liste erreichen und die neue Liste erhalten, werden die letzten Tweets dupliziert, was bedeutet, dass Sie in meinem Feed zweimal die gleichen Tweets haben.

Zum Beispiel haben Sie diesen Feed: TweetA, TweetB, TweetC. Wenn wir tweetC erreichen, fragen wir nach den alten Tweets und sobald wir sie erhalten haben, verwende ich die Methode namens setData, um dem Adapter die neue Liste zu geben und die Änderung des Benachrichtigungsdatensatzes anzufordern. aber wenn Sie die Liste und Update zu erhalten, sehen Sie die Listenansicht zeigt:

tweetA, tweetB, tweetC, tweetC, tweeten D, tweetF

Ich dachte, es ist aus der neuen Liste kommen empfangen und nicht die Listenansicht und zu denken, dass ich das erste Element der neuen Liste nur entfernen kann, aber die Frage bleibt, in meinem Fall (wenn das erste Element zu entfernen), tweeten D verschwinden und zeigt tweetF

hier

der Code:

Feedfragment:

Handler wird verwendet, um das Ergebnis von twitter

private final Handler handler = new Handler() { 
    @Override 
    public void handleMessage(android.os.Message msg) { 
     ArrayList<Status> status = (ArrayList<Status>) msg.obj ; 
     mStatus = status; 
     mTwitterFeedAdapter.setData (mStatus); 
     mTwitterFeedAdapter.notifyDataSetChanged(); 
     } 
    } 
} ; 

Adapter zurück zu bekommen: Jede Idee

public View getView(final int position, View convertView, ViewGroup parent) { 
    Log.d(TAG,"position"+position) ; 
    mPosition = position; 

    mViewHolder = new TweetViewHolder(mActivity); 

    mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE) ; 

    if(convertView == null) { 
     convertView = mInflater.inflate(R.layout.twitter_feed,null) ; 
     mViewHolder.userProfilePicture = (ImageView) convertView.findViewById(R.id.profileImg) ; 
     mViewHolder.userRealName = (TextView) convertView.findViewById(R.id.userName) ; 
     .... 
     convertView.setTag(mViewHolder) ; 
    } 
    else { 
     mViewHolder = (TweetViewHolder) convertView.getTag() ; 
    } 
    /* detect end of the list and request old tweets*/ 
    if(position >= mStatus.size() - 1){ 
     mTweetFeedFragment.populateOldTimeLine(); 

    /* both classes are used to extract data and put it in a easy 
    user format */ 
    mTweetMediaInfo = new TweetMediaInfo(mStatus.get(position)); 
    mTweetInfo = new TweetInfo(mStatus.get(position)); 

    showTweetContent(); 

    return convertView ; 

} 

public void setData(ArrayList<Status> status){ 
    mStatus = status; 
} 

?

Antwort

2

können Sie Hashset wie diesen zum Entfernen des redudancey

list = new ArrayList<String>(new LinkedHashSet<String>(list))