繁体   English   中英

如何将 AsyncTask 从 Adapter onBindViewHolder() 移动到 Activity onChildEventListener

[英]How to move AsyncTask FROM Adapter onBindViewHolder() TO Activity onChildEventListener

我正在使用 RecyclerView 来显示推文,其中一些数据存储在 Firebase 中。当应用程序启动时,我使用 ChildEventListener 来填充提要,这将有助于稍后添加新推文并且必须更新提要时的效率. 我的问题是一些数据需要用 twitter4j 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);
    }
  }
}

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());

    ...
  }

儿童事件监听器:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM