如何将AsyncTask从适配器onBindViewHolder()移动到活动onChildEventListener



我正在使用RecyclerView来显示Tweets,其中一些数据存储在Firebase中。当应用程序启动时,我使用ChildEventListener来填充提要,这将有助于以后在添加新的推文并且必须更新提要时提高效率。我的问题是,有些数据需要使用twitter4jneneneba API(即推特个人资料图像的作者(进行检索,无法存储在Firebase中。我当前正在适配器onBindViewHolder((中使用AsyncTask获取此数据。我很好奇如何在我的ChildEventListener中完成这项工作,以便在设置适配器之前可以获得数据。当我在适配器onBindViewHolder((中运行AsyncTask时,配置文件映像需要一些时间才能加载,这对于用户体验来说显然是不可取的。

异步任务:

public class StatusAsyncTask extends AsyncTask<Long, Integer, Status>
{
TweetListAdapterFeed tweetListAdapterFeed;
TweetListAdapterFeed.ViewHolder viewHolder;
int position;
public StatusAsyncTask(TweetListAdapterFeed tweetListAdapterFeed, TweetListAdapterFeed.ViewHolder viewHolder, int position)
{
this.tweetListAdapterFeed = tweetListAdapterFeed;
this.viewHolder = viewHolder;
this.position = position;
}
protected twitter4j.Status doInBackground(Long... tweetStatusId)
{
ConfigurationBuilder cb = new ConfigurationBuilder();
TwitterFactory tf = new TwitterFactory(cb.build());
Twitter twitter = tf.getInstance();
twitter4j.Status status;
try
{
status = twitter.showStatus(tweetStatusId[0]);
return status;
}
catch (TwitterException e)
{
e.printStackTrace();
return null;
}
}
protected void onPostExecute(twitter4j.Status status)
{
if (status != null)
{
viewHolder.retweetCount.setText(String.valueOf(status.getRetweetCount()));
viewHolder.likeCount.setText(String.valueOf(status.getFavoriteCount()));
Picasso.get().load(status.getUser().get400x400ProfileImageURL()).fit().into(viewHolder.profileImage);
}
}
}

BindViewHolder((上的TweetListAdapterFeed:

@Override
public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, final int i)
{
int viewType = holder.getItemViewType();
final ViewHolder viewHolder = (ViewHolder)holder;
// Update Like and Retweet Count via AsyncTask
new StatusAsyncTask(this, viewHolder, i).execute(mData.get(i).getTweetStatusID());
...
}

ChildEventListener:

public static final List<TweetData> listFeedList = new ArrayList<>();
public static TweetListAdapterFeed mAdapter;
ChildEventListener tweetChildEventListener = new ChildEventListener()
{
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s)
{
if (dataSnapshot.exists())
{
TweetData tweetData = dataSnapshot.getValue(TweetData.class);
if ((tweetData != null) && (!tweetData.tweetText.equals("")))
{
listFeedList.add(listFeedList.size(), tweetData);
mAdapter.notifyItemInserted(listFeedList.size());
}
}
}
}

如果我理解你的意思,你希望照片在添加新项目的同时准备好。这是可以做到的,但当您获得新数据时,您必须使用与StatusSyncTask相同的类,并接收照片并将其完全传递给您的适配器。也就是说,下载照片并将存储中的照片地址传递给适配器。这是的艰难之路

但是,获得更好视图的更简单方法是在照片中使用XML中的固定占位符图像。

另一种方法是使用毕加索自己的占位符。

最新更新