【问题标题】:Get item fully visible or not in Recyclerview adapter在 Recyclerview 适配器中获取项目是否完全可见
【发布时间】:2018-04-25 08:59:44
【问题描述】:

我正在制作一个 android 应用程序,其中 RecyclerView 包含 GIF 列表,现在我想开发这样的功能,比如当 GIF 项目对用户完全可见时,然后它开始加载,一旦它稍微失去焦点用户应该停止加载。

我已经在 recyclerview 中显示了 GIF,现在剩下的唯一部分就是如何让这样的 GIF 完全可见或失去焦点。我想要适配器内的这样的代码,表明该项目是完全可见的并且该项目失去焦点。

我的适配器类

public class FeedAdapter extends RecyclerView.Adapter<FeedAdapter.MyViewHolder> {


private List<FeedModel> feedList;
Context context;

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.single_item, parent, false);

    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
    holder.setData(feedList.get(position));

    new GifDataDownloader() {
        @Override
        protected void onPostExecute(final byte[] bytes) {
            holder.gifImageView.setBytes(bytes);
            holder.gifImageView.startAnimation();
        }
    }.execute(feedList.get(position).getUrl());


}

public FeedAdapter(Context context, List<FeedModel> feedList) {
    this.feedList = feedList;
    this.context = context;
}

@Override
public int getItemCount() {
    return feedList.size();
}

public void setGridData(ArrayList<FeedModel> feedList) {
    this.feedList = feedList;
    notifyDataSetChanged();
}

public class MyViewHolder extends RecyclerView.ViewHolder  {

    FeedModel item;
    GifImageView gifImageView;
    public MyViewHolder(View itemView) {
        super(itemView);
        gifImageView = itemView.findViewById(R.id.gifImageView);
    }

    public void setData(FeedModel item) {
        this.item = item;
    }
}

我的活动

public class MainActivity extends AppCompatActivity {
ImageView imageView;
ImageView imageView1;
private PendingIntent pendingIntent;
RecyclerView recyclerView;
FeedAdapter mAdapter;
ProgressBar progressBar;
GridLayoutManager manager;
Spinner countrySpinner;
ArrayList<FeedModel> feedList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    feedList = new ArrayList<>(10);
    for (int i = 0; i < 10; i++) {
        FeedModel feedModel = new FeedModel();
        feedModel.setUrl("https://media.tenor.com/images/925bfbaad2f947987bcf18b9167b3326/tenor.gif");
        feedList.add(feedModel);
    }


    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    mAdapter = new FeedAdapter(getApplicationContext(), feedList);
    manager = new GridLayoutManager(getApplicationContext(), 1, GridLayoutManager.VERTICAL, false);
    recyclerView.setLayoutManager(manager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setVisibility(View.VISIBLE);
    recyclerView.setAdapter(mAdapter);

}

【问题讨论】:

  • 请添加您的代码,以便我们为您提供帮助。谢谢!
  • @IgnacioAra 我添加了我的代码,请帮忙
  • 勾选这个github.com/danylovolokh/VideoPlayerManager 。您可能需要根据需要进行更改。

标签: android android-layout android-recyclerview


【解决方案1】:

使用滑翔显示图像和gif等的更好方法。它需要您定义的所有高级。

将以下依赖添加到应用级别的 gradle 文件中

    implementation 'com.github.bumptech.glide:glide:4.7.1'

然后像这样在适配器中使用后..

private Context context;
  // define context into constructor 
  public RecyclerviewAdapter(List<StepsItem> stepsItems, Context context) {
    this.stepsItems = stepsItems;
    this.context = context;
}

 Glide.with(context).load(yoururl).into(holder.mIvIcon);

【讨论】:

    【解决方案2】:

    onstart() 方法一样创建视图后启动 gif 而当你想在用户不再与应用交互时停止gif,请停止onpause()方法中的gif。

    【讨论】:

    • 你将如何检测到这个user is no more interact with app
    • 当应用程序处于前台并且用户单击电源按钮并关闭屏幕电源时,在这种情况下会调用 onpause 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 2019-10-30
    相关资源
    最近更新 更多