【发布时间】:2021-02-07 03:39:57
【问题描述】:
我正在使用 RecyclerView 来显示推文,其中一些数据存储在 Firebase 中。当应用程序启动时,我使用 ChildEventListener 来填充提要,这将有助于以后添加新推文并且必须更新提要时提高效率。我的问题是某些数据需要使用 twitter4j API(即 Tweet 的个人资料图片的作者)检索,并且不能存储在 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);
}
}
}
TweetListAdapterFeed onBindViewHolder():
@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());
}
}
}
}
【问题讨论】:
标签: android firebase android-recyclerview android-asynctask