我有一个回收视图,它从火场获取它的数据,我想做的是,当所有的数据被加载,一旦回收器视图被填充,那么闪烁动画应该停止和离开。我也试过了进度条,它没有任何打嗝。但在微光动画的情况下,它不会停止。我创建了两种方法,一种是启动动画,另一种是停止动画。请帮助我的代码和建议,我需要改变什么,以达到预期的结果。我在我的stopLoading中调用onBindViewHolder函数。提前谢谢。
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文件
<?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>发布于 2020-04-21 13:13:56
首先,在全球范围内声明。
private ShimmerFrameLayout shimmerLayout;然后声明onCreate()节
shimmerLayout =findViewById(R.id.shimmer_view);对于“秀案”,
shimmerLayout.setVisibility(View.VISIBLE);
shimmerLayout.startShimmer();为了阻止案件,
if(shimmerLayout.isShimmerVisible())
{
shimmerLayout.stopShimmer();
shimmerLayout.setVisibility(View.GONE);
}代码编辑
试着
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");
}
}发布于 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 文件中显式地将ShimmerFrameLayout的app:shimmer_auto_start属性设置为false。
发布于 2020-09-14 15:57:35
我想我不能确切地解释为什么它不能工作,onBindViewHolder。我认为这是关于onBindViewHolder的。但我知道为什么我们在以前编辑的代码中看到了白色屏幕(由IntelliJ Amiya共享)。闪光的开始和结束之间没有时间,因此它的开始和结束很快。但是如果我们设定了时间,我们就可以看到它的开始和结束。我们只需要汉德勒。停下来之后我们应该用
shimmerFrameLayout.setVisibility(View.GONE);
而不是
shimmerFrameLayout.setVisibility(View.INVISIBLE);
shimmerFrameLayout不占用空间。
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是有意义的。编辑完整代码后:
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();
}https://stackoverflow.com/questions/61344387
复制相似问题