java - 当互联网不可用时禁用 onClicklistener

标签 java android onclicklistener android-adapter

我正在使用适配器类来使用 Blogpost 和 Like 按钮填充我的 Fragment。但是,当设备离线并且用户按下“类似”按钮时,应用程序就会崩溃。 所以我希望在设备离线时禁用点击功能,仅在设备在线时启用。

那么我怎样才能将按钮应用到clickable(false);当设备离线时。

这是我的 BlogRecycleadapter 类代码

package com.nepalpolice.cdp;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FieldValue;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreException;
import com.google.firebase.firestore.QuerySnapshot;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import de.hdodenhof.circleimageview.CircleImageView;

import static com.nepalpolice.cdp.webfaq.isNetworkStatusAvialable;

public class BlogRecyclerAdapter extends RecyclerView.Adapter<BlogRecyclerAdapter.ViewHolder> {

    public List<BlogPost> blog_list;
    public Context context;
    private Button mbutton;

    private FirebaseFirestore firebaseFirestore;
private FirebaseAuth firebaseAuth;

    public BlogRecyclerAdapter(List<BlogPost> blog_list){

        this.blog_list = blog_list;

    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.blog_list_item, parent, false);
        context = parent.getContext();
        firebaseFirestore = FirebaseFirestore.getInstance();
        firebaseAuth = FirebaseAuth.getInstance();

        mbutton = (Button)  view.findViewById(R.id.blog_like_btn);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {

        holder.setIsRecyclable(false);

        final String blogPostId = blog_list.get(position).BlogPostId;
        final String currentUserId = firebaseAuth.getCurrentUser().getUid();

        String desc_data = blog_list.get(position).getDesc();
        holder.setDescText(desc_data);

        String image_url = blog_list.get(position).getImage_url();
        holder.setBlogImage(image_url);

        String user_id = blog_list.get(position).getUser_id();
        //User Data will be retrieved here...
        firebaseFirestore.collection("Users").document(user_id).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {

                if(task.isSuccessful()){

                    String userName = task.getResult().getString("name");
                    String userImage = task.getResult().getString("image");

                    holder.setUserData(userName, userImage);


                } else {

                    //Firebase Exception

                }

            }
        });


        long millisecond = blog_list.get(position).getTimestamp().getTime();
        String dateString = DateFormat.format("MM/dd/yyyy", new Date(millisecond)).toString();
        holder.setTime(dateString);

        //Get Likes Count
        firebaseFirestore.collection("Posts/" + blogPostId + "/Likes").addSnapshotListener(((Main2Activity) context),new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {

                if (!documentSnapshots.isEmpty()){

int count = documentSnapshots.size();
holder.updateLikesCount(count);

                }else{
holder.updateLikesCount(0);

                }

            }
        });



        //Get Likes

        firebaseFirestore.collection("Posts/" + blogPostId + "/Likes").document(currentUserId).addSnapshotListener(((Main2Activity) context),new EventListener<DocumentSnapshot>() {
            @Override
            public void onEvent(DocumentSnapshot documentSnapshot, FirebaseFirestoreException e) {

                if (documentSnapshot.exists()){

                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                        holder.blogLikeBtn.setImageDrawable(context.getDrawable(R.mipmap.action_like_accent));
                    }
                    else {
                        holder.blogLikeBtn.setImageDrawable(context.getResources().getDrawable(R.mipmap.action_like_accent));
                    }
                } else {

                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                        holder.blogLikeBtn.setImageDrawable(context.getDrawable(R.mipmap.action_like_gray));
                    }else{
                        holder.blogLikeBtn.setImageDrawable(context.getResources().getDrawable(R.mipmap.action_like_gray));
                    }
                }

            }
        });

        //like Feature

        holder.blogLikeBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                firebaseFirestore.collection("Posts/" + blogPostId + "/Likes").document(currentUserId).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                        if (!task.getResult().exists()){

                            Map<String, Object> likesMap = new HashMap<>();
                            likesMap.put("timestamp", FieldValue.serverTimestamp());


                            firebaseFirestore.collection("Posts/" + blogPostId + "/Likes").document(currentUserId).set(likesMap);

                        } else {
                            firebaseFirestore.collection("Posts/" + blogPostId + "/Likes").document(currentUserId).delete();

                        }

                    }
                });



            }
        });

    }

    @Override
    public int getItemCount() {

        return blog_list.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        private View mView;

        private TextView descView;
        private ImageView blogImageView;
        private TextView blogDate;

        private TextView blogUserName;
        private CircleImageView blogUserImage;
        private ImageView blogLikeBtn;
        private  TextView blogLikeCount;

        public ViewHolder(View itemView) {
            super(itemView);
            mView = itemView;



        }

        public void setDescText(String descText){

            descView = mView.findViewById(R.id.blog_desc);
            descView.setText(descText);

            blogLikeBtn = mView.findViewById(R.id.blog_like_btn);
        }

        public void setBlogImage(String downloadUri){

            blogImageView = mView.findViewById(R.id.blog_image);
            RequestOptions requestOptions = new RequestOptions();
            requestOptions.placeholder(R.drawable.image_placeholder);
            Glide.with(context).applyDefaultRequestOptions(requestOptions).load(downloadUri).into(blogImageView);

        }

        public void setTime(String date) {

            blogDate = mView.findViewById(R.id.blog_date);
            blogDate.setText(date);

        }

        public void setUserData(String name, String image){

            blogUserImage = mView.findViewById(R.id.blog_user_image);
            blogUserName = mView.findViewById(R.id.blog_user_name);

            blogUserName.setText(name);

            RequestOptions placeholderOption = new RequestOptions();
            placeholderOption.placeholder(R.drawable.profile_placeholder);

            Glide.with(context).applyDefaultRequestOptions(placeholderOption).load(image).into(blogUserImage);

        }

public void  updateLikesCount (int count){

            blogLikeCount = mView.findViewById(R.id.blog_like_count);
            blogLikeCount.setText(count + "Likes");
}

    }

这是错误报告的图像文件

enter image description here

我用过

 mimageview = (ImageView) view.findViewById(R.id.blog_like_btn);

if (!isNetworkStatusAvialable(mimageview.getContext())){
mimageview.setClickable(false);
}

但它仍然抛出一个错误并没有解决问题。

最佳答案

这里的代码将检查用户是否有互联网连接。

 ConnectivityManager connectivityManager 
      = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
if(!(activeNetworkInfo != null && activeNetworkInfo.isConnected())){
 //user does not have an internet connection
 //put code here that diables the button 
} else {
//user does have an internet connection
//put code here that enables the button
 }

在将数据绑定(bind)到 View 时添加此代码,并在没有连接时禁用该按钮。

根据您的代码,它看起来像这样:

 @Override
public void onBindViewHolder(final ViewHolder holder, int position) {
ConnectivityManager connectivityManager 
      = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
if(!(activeNetworkInfo != null && activeNetworkInfo.isConnected())){
 //user does not have an internet connection
 //heres code that diables the button 
 holder.blogLikeBtn.clickable(false);
}
//put the rest of your method code here
}

虽然这是解决问题的一种方法,但更好的方法是将此代码添加到按钮的 onClick 事件中,然后检查用户是否有连接,如果没有,则向他显示一个对话框,解释他需要互联网连接,然后退出。

这是解决您的问题的两种方法。

注意:请确保将此权限添加到 list <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />否则在使用上述代码时将会出现异常。

关于java - 当互联网不可用时禁用 onClicklistener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49496534/

相关文章:

android - 如何在您的 Android 应用程序中使用 Intent 打开 WhatsApp

java - 在我的 IntelliJ 项目中使用 Maven 资源时遇到问题

android - 如何更改Chip View 的字体?

youtube-api - Youtube 视频播放器全屏点击事件

java - 具有自定义 View : Resize to wrap the view's content 的 AlertDialog

android - 循环遍历Android View 的所有 subview ?

Android:如何通过单击按钮禁用tablayout控件之间的滑动

java - 如何等待多线程 shell 脚本执行完成在我的 Web 服务中调用?

java - 在 Android Studio 中将数据从 MySQL 显示到 TextView

java - 比较两个具有 Double.positive_infinity 值的变量是否合法?