ArrayList 重复元素出现在列表视图中
ArrayList duplicate element show-up in list view
我正在开发一个应用程序(类似于 Twitter),我的提要基于列表视图 + 适配器。默认情况下,您会获得提要的前 20 个元素,当向下滚动并到达列表末尾时,包含视图的片段会向 Twitter 发送请求以获取剩余的提要,一旦我们收到它们,我就会更新列表句柄由适配器发送并发送数据通知更改。整个过程有效,但我在列表末尾得到了一个但是。
到达列表末尾并获取新列表时,最后的推文会重复,这意味着在我的供稿中你有 2 次相同的推文。
例如,您有此供稿:tweetA、tweetB、tweetC。当到达 tweetC 时,我们请求旧推文,一旦收到,我将使用名为 setData 的方法将新列表提供给适配器并请求通知数据集更改。但是当您获取列表并更新时,您会看到列表视图显示:
tweetA、tweetB、tweetC、tweetC、tweet D、tweetF
我认为它来自收到的新列表而不是列表视图,我认为我可以删除新列表的第一个元素但问题仍然存在,在我的情况下(删除第一个元素时),tweet D 消失并显示 tweetF
代码如下:
提要片段:
@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))
我正在开发一个应用程序(类似于 Twitter),我的提要基于列表视图 + 适配器。默认情况下,您会获得提要的前 20 个元素,当向下滚动并到达列表末尾时,包含视图的片段会向 Twitter 发送请求以获取剩余的提要,一旦我们收到它们,我就会更新列表句柄由适配器发送并发送数据通知更改。整个过程有效,但我在列表末尾得到了一个但是。
到达列表末尾并获取新列表时,最后的推文会重复,这意味着在我的供稿中你有 2 次相同的推文。
例如,您有此供稿:tweetA、tweetB、tweetC。当到达 tweetC 时,我们请求旧推文,一旦收到,我将使用名为 setData 的方法将新列表提供给适配器并请求通知数据集更改。但是当您获取列表并更新时,您会看到列表视图显示:
tweetA、tweetB、tweetC、tweetC、tweet D、tweetF
我认为它来自收到的新列表而不是列表视图,我认为我可以删除新列表的第一个元素但问题仍然存在,在我的情况下(删除第一个元素时),tweet D 消失并显示 tweetF
代码如下:
提要片段:
@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))