java - ArrayList 重复元素出现在 ListView 中

标签 java android listview twitter4j

我正在开发一个应用程序(类似 Twitter),我的提要基于 ListView + 适配器。默认情况下,您会获得提要的前 20 个元素,当向下滚动并到达列表末尾时,包含 View 的 fragment 会向 Twitter 发送请求以获取剩余的提要,一旦我们收到它们,我就会更新列表句柄由适配器发送并发送数据通知更改。整个过程有效,但我在列表末尾得到了一个但是。

当到达列表末尾并获取新列表时,最后的推文会重复,这意味着在我的提要中你有 2 次相同的推文。

例如,您有此提要:tweetA、tweetB、tweetC。当到达 tweetC 时,我们请求旧推文,一旦收到,我将使用名为 setData 的方法将新列表提供给适配器并请求通知数据集更改。但是当您获取列表并更新时,您会看到 ListView 显示:

tweetA, tweetB, tweetC, tweetC, tweet D, tweetF

我认为它来自收到的新列表而不是 ListView ,并且认为我可以删除新列表的第一个元素但问题仍然存在,就我而言(删除第一个元素时),tweet D 消失了并显示 tweetF

代码如下:

提要 fragment :

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    Log.d(TAG, "inside onCreateView");


    View view = inflater.inflate(R.layout.twitter_swip_list,container, false);
    mlistview = (ListView) view.findViewById(R.id.listview) ;   
    TwitterTimeLines twitt = new          TwitterTimeLines(mActivity,TwitterHomeActivity.getTwitterHandler());
        twitt.getTimeline(handler);     return view;
}

handler 用于从 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();
        }
    }
} ;

适配器:

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;
}

有什么想法吗?

最佳答案

你可以像这样使用 HasHSet 来移除冗余

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

关于java - ArrayList 重复元素出现在 ListView 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38725952/

相关文章:

java - 不同情况下具有枚举值的 ConfigurationProperties

java - 如何使用 spring-cloud-netflix 和 feign 编写集成测试

java - 无法在模拟器中启动 AVD。 ?安卓工作室

WPF:多列列表框/ ListView ?

listview - 如何在 ListView 中展开卡片以显示更多数据,甚至是另一个 ListView

JavaFx:TableView 足够还是我需要自定义 Controller

java - 使用 xjc 从多个 xsd 文件生成 Java

Android - 在布局之间切换

android - 我们可以使用其他类型的时间选择器吗?

android - (优先)如何在 FragmentActivity 中对特定 ListView 使用 setListAdapter