首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不停止加载RecyclerView的Shimmer动画

不停止加载RecyclerView的Shimmer动画
EN

Stack Overflow用户
提问于 2020-04-21 13:11:19
回答 3查看 3.9K关注 0票数 4

我有一个回收视图,它从火场获取它的数据,我想做的是,当所有的数据被加载,一旦回收器视图被填充,那么闪烁动画应该停止和离开。我也试过了进度条,它没有任何打嗝。但在微光动画的情况下,它不会停止。我创建了两种方法,一种是启动动画,另一种是停止动画。请帮助我的代码和建议,我需要改变什么,以达到预期的结果。我在我的stopLoading中调用onBindViewHolder函数。提前谢谢。

代码语言:javascript
复制
public class buynow extends AppCompatActivity {

private RecyclerView recyclerView;
private DatabaseReference ProductRef;
private FirebaseRecyclerAdapter<Products, UsersViewHolder> firebaseRecyclerAdapter;
private String searchText = "";

public void showLoading(){
    ShimmerFrameLayout shimmerFrameLayout = findViewById(R.id.shimmer_view);
    shimmerFrameLayout.startShimmerAnimation();
}

public void stopLoading(){
    ShimmerFrameLayout shimmerFrameLayout = findViewById(R.id.shimmer_view);
    shimmerFrameLayout.setVisibility(View.GONE);
}


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_buynow);
    Firebase.setAndroidContext(buynow.this);

    Bundle extras = getIntent().getExtras();
    if(extras != null){
        searchText = extras.getString("phone_name");
    }

    setActionBarTitle();

    showLoading();

    Toast.makeText(buynow.this,"Loading",Toast.LENGTH_SHORT).show();

    ProductRef = FirebaseDatabase.getInstance().getReference().child("Products");

    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    firebaseUserSearch(searchText);
}

private void firebaseUserSearch(String searchText){

    Query firebaseSearchQuery = ProductRef.orderByChild("pname").startAt(searchText).endAt(searchText + "\uf8ff");

    FirebaseRecyclerOptions<Products> options = new FirebaseRecyclerOptions.Builder<Products>()
            .setQuery(firebaseSearchQuery,Products.class).build();

    firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Products, UsersViewHolder>(options) {


        @Override
        protected void onBindViewHolder(@NonNull UsersViewHolder holder, int position, @NonNull Products model) {

            holder.setDetails(getApplicationContext(), model.getPname(), model.getPprice(), model.getPmrp(), model.getPcondition(), model.getPimage());
            stopLoading();
        }

        @NonNull
        @Override
        public UsersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.buy_now_phones,parent,false);
            return new UsersViewHolder(view);

        }
    };

    recyclerView.setAdapter(firebaseRecyclerAdapter);
    firebaseRecyclerAdapter.startListening();

}

@Override
protected void onStart() {
    super.onStart();
    firebaseRecyclerAdapter.startListening();
}

//View Holder Class
public static class UsersViewHolder extends RecyclerView.ViewHolder{

    View mView;

    private UsersViewHolder(@NonNull View itemView) {
        super(itemView);
        mView = itemView;
    }

    private void setDetails(Context context, String phoneName, String phonePrice, String phoneMrp, String phoneCondition, String phoneImage){

        TextView phone_name = (TextView) mView.findViewById(R.id.product_name);
        TextView phone_price = (TextView) mView.findViewById(R.id.product_price);
        TextView phone_mrp = (TextView) mView.findViewById(R.id.product_mrp);
        TextView phone_condition = (TextView) mView.findViewById(R.id.product_condition);
        ImageView phone_image = (ImageView)mView.findViewById(R.id.product_image);

        phone_name.setText(phoneName);

        //fromatting phone price
        double amount = Double.parseDouble(phonePrice);
        DecimalFormat formatter = new DecimalFormat("#,###.00");
        phone_price.setText("₹"+formatter.format(amount));

        //fromatting phone mrp
        double amount0 = Double.parseDouble(phoneMrp);
        DecimalFormat formatter0 = new DecimalFormat("#,###.00");
        phone_mrp.setText("MRP "+formatter.format(amount0));
        phone_mrp.setPaintFlags(phone_mrp.getPaintFlags()| Paint.STRIKE_THRU_TEXT_FLAG);
        phone_condition.setText(phoneCondition);
        Picasso.with(context).load(phoneImage).into(phone_image);

    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.action_bar,menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_search) {
        Intent intent = new Intent(buynow.this,buynow_device_search.class);
        startActivity(intent);
    }
    return super.onOptionsItemSelected(item);
}

public void setActionBarTitle() {
    getSupportActionBar().setTitle("Used Phones");
}

}

XML文件

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".buynow">

<com.facebook.shimmer.ShimmerFrameLayout
    android:id="@+id/shimmer_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <include
            layout="@layout/place_holder_layout"/>

        <include
            layout="@layout/place_holder_layout"/>

        <include
            layout="@layout/place_holder_layout"/>

        <include
            layout="@layout/place_holder_layout"/>

        <include
            layout="@layout/place_holder_layout"/>

        <include
            layout="@layout/place_holder_layout"/>

    </LinearLayout>

</com.facebook.shimmer.ShimmerFrameLayout>


<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</androidx.recyclerview.widget.RecyclerView>

</LinearLayout>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-21 13:13:56

首先,在全球范围内声明。

代码语言:javascript
复制
private ShimmerFrameLayout shimmerLayout;

然后声明onCreate()节

代码语言:javascript
复制
 shimmerLayout      =findViewById(R.id.shimmer_view);

对于“秀案”,

代码语言:javascript
复制
  shimmerLayout.setVisibility(View.VISIBLE);
  shimmerLayout.startShimmer();

为了阻止案件,

代码语言:javascript
复制
 if(shimmerLayout.isShimmerVisible())
       {
           shimmerLayout.stopShimmer();
           shimmerLayout.setVisibility(View.GONE);
       }

代码编辑

试着

代码语言:javascript
复制
public class buynow extends AppCompatActivity {

private RecyclerView recyclerView;
private DatabaseReference ProductRef;
private FirebaseRecyclerAdapter<Products, UsersViewHolder> firebaseRecyclerAdapter;
private String searchText = "";
ShimmerFrameLayout shimmerFrameLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_buynow);
    Firebase.setAndroidContext(buynow.this);

    Bundle extras = getIntent().getExtras();
    if(extras != null){
        searchText = extras.getString("phone_name");
    }

    setActionBarTitle();

    ProductRef = FirebaseDatabase.getInstance().getReference().child("Products");

    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    shimmerFrameLayout = findViewById(R.id.shimmer_view);
    shimmerFrameLayout.setVisibility(View.VISIBLE);
    shimmerFrameLayout.startShimmer();
    recyclerView.setVisibility(View.INVISIBLE);


    Toast.makeText(buynow.this,"Loading",Toast.LENGTH_SHORT).show();


    firebaseUserSearch(searchText);
}

private void firebaseUserSearch(String searchText){

    Query firebaseSearchQuery = ProductRef.orderByChild("pname").startAt(searchText).endAt(searchText + "\uf8ff");

    FirebaseRecyclerOptions<Products> options = new FirebaseRecyclerOptions.Builder<Products>()
            .setQuery(firebaseSearchQuery,Products.class).build();

    firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Products, UsersViewHolder>(options) {


        @Override
        protected void onBindViewHolder(@NonNull UsersViewHolder holder, int position, @NonNull Products model) {

            holder.setDetails(getApplicationContext(), model.getPname(), model.getPprice(), model.getPmrp(), model.getPcondition(), model.getPimage());

        }

        @NonNull
        @Override
        public UsersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.buy_now_phones,parent,false);
            return new UsersViewHolder(view);

        }
    };

    shimmerFrameLayout.setVisibility(View.INVISIBLE);
    shimmerFrameLayout.stopShimmer();
    recyclerView.setVisibility(View.VISIBLE);
    recyclerView.setAdapter(firebaseRecyclerAdapter);
    firebaseRecyclerAdapter.startListening();

}

@Override
protected void onStart() {
    super.onStart();
    firebaseRecyclerAdapter.startListening();
}

//View Holder Class
public static class UsersViewHolder extends RecyclerView.ViewHolder{

    View mView;

    private UsersViewHolder(@NonNull View itemView) {
        super(itemView);
        mView = itemView;
    }

    private void setDetails(Context context, String phoneName, String phonePrice, String phoneMrp, String phoneCondition, String phoneImage){

        TextView phone_name = (TextView) mView.findViewById(R.id.product_name);
        TextView phone_price = (TextView) mView.findViewById(R.id.product_price);
        TextView phone_mrp = (TextView) mView.findViewById(R.id.product_mrp);
        TextView phone_condition = (TextView) mView.findViewById(R.id.product_condition);
        ImageView phone_image = (ImageView)mView.findViewById(R.id.product_image);

        phone_name.setText(phoneName);

        //fromatting phone price
        double amount = Double.parseDouble(phonePrice);
        DecimalFormat formatter = new DecimalFormat("#,###.00");
        phone_price.setText("₹"+formatter.format(amount));

        //fromatting phone mrp
        double amount0 = Double.parseDouble(phoneMrp);
        DecimalFormat formatter0 = new DecimalFormat("#,###.00");
        phone_mrp.setText("MRP "+formatter.format(amount0));
        phone_mrp.setPaintFlags(phone_mrp.getPaintFlags()| Paint.STRIKE_THRU_TEXT_FLAG);
        phone_condition.setText(phoneCondition);
        Picasso.with(context).load(phoneImage).into(phone_image);

    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.action_bar,menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_search) {
        Intent intent = new Intent(buynow.this,buynow_device_search.class);
        startActivity(intent);
    }
    return super.onOptionsItemSelected(item);
}

public void setActionBarTitle() {
    getSupportActionBar().setTitle("Used Phones");
}

}
票数 5
EN

Stack Overflow用户

发布于 2021-08-14 17:56:57

首先,与OP的代码一样,存在对方法startShimmerAnimation()的调用,这意味着OP使用的是依赖项

com.facebook.shimmer:shimmer:0.1.0@aar

所以更好的办法是

com.facebook.shimmer:shimmer:0.5.0

现在的问题是ShimmerFrameLayout有一个属性app:shimmer_auto_start,该属性默认设置为true,因此ShimmerFrameLayout's shimmer自动启动,不能由方法startShimmer()stopShimmer()控制。

因此,如果您想控制ShimmerFrameLayout的闪烁器的启动和停止,那么必须在XML 文件中显式地将ShimmerFrameLayoutapp:shimmer_auto_start属性设置为false

票数 1
EN

Stack Overflow用户

发布于 2020-09-14 15:57:35

我想我不能确切地解释为什么它不能工作,onBindViewHolder。我认为这是关于onBindViewHolder的。但我知道为什么我们在以前编辑的代码中看到了白色屏幕(由IntelliJ Amiya共享)。闪光的开始和结束之间没有时间,因此它的开始和结束很快。但是如果我们设定了时间,我们就可以看到它的开始和结束。我们只需要汉德勒。停下来之后我们应该用

shimmerFrameLayout.setVisibility(View.GONE);

而不是

shimmerFrameLayout.setVisibility(View.INVISIBLE);

shimmerFrameLayout不占用空间。

代码语言:javascript
复制
    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {

            shimmerFrameLayout.setVisibility(View.GONE);
            shimmerFrameLayout.stopShimmer();
            recyclerView.setVisibility(View.VISIBLE);

        }
    }, 1000);

即使没有互联网,Firebase RecyclerView也会显示当它是最后一次互联网连接时获得的信息。如果在应用程序关闭时删除Firebase上的任何数据,然后打开应用程序,它将显示我们上次打开应用程序的数据,并在几次更新之后显示该数据。我们可以给它时间通过Handler进行更新,并让它在数据出现之前更新数据。所以我认为使用Handler是有意义的。编辑完整代码后:

代码语言:javascript
复制
 public class buynow extends AppCompatActivity {

 private RecyclerView recyclerView;
 private DatabaseReference ProductRef;
 private FirebaseRecyclerAdapter<Products, UsersViewHolder> firebaseRecyclerAdapter;
 private String searchText = "";
 ShimmerFrameLayout shimmerFrameLayout;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_buynow);
 Firebase.setAndroidContext(buynow.this);

 Bundle extras = getIntent().getExtras();
 if(extras != null){
    searchText = extras.getString("phone_name");
 }

setActionBarTitle();

ProductRef = FirebaseDatabase.getInstance().getReference().child("Products");

recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

shimmerFrameLayout = findViewById(R.id.shimmer_view);
shimmerFrameLayout.setVisibility(View.VISIBLE);
shimmerFrameLayout.startShimmer();
recyclerView.setVisibility(View.INVISIBLE);


Toast.makeText(buynow.this,"Loading",Toast.LENGTH_SHORT).show();


firebaseUserSearch(searchText);
}

private void firebaseUserSearch(String searchText){

Query firebaseSearchQuery = ProductRef.orderByChild("pname").startAt(searchText).endAt(searchText + "\uf8ff");

FirebaseRecyclerOptions<Products> options = new FirebaseRecyclerOptions.Builder<Products>()
        .setQuery(firebaseSearchQuery,Products.class).build();

firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Products, UsersViewHolder>(options) {


    @Override
    protected void onBindViewHolder(@NonNull UsersViewHolder holder, int position, @NonNull Products model) {

        holder.setDetails(getApplicationContext(), model.getPname(), model.getPprice(), model.getPmrp(), model.getPcondition(), model.getPimage());

    }

    @NonNull
    @Override
    public UsersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.buy_now_phones,parent,false);
        return new UsersViewHolder(view);

    }
};

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {

        shimmerFrameLayout.setVisibility(View.GONE);
        shimmerFrameLayout.stopShimmer();
        recyclerView.setVisibility(View.VISIBLE);

    }
}, 1000);

recyclerView.setAdapter(firebaseRecyclerAdapter);
firebaseRecyclerAdapter.startListening();

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61344387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档