【问题标题】:Recyclerview is not showing unless i focus the edittext除非我关注编辑文本,否则 Recyclerview 不会显示
【发布时间】:2020-06-27 12:07:21
【问题描述】:

我有一个片段(我也在活动中尝试过),它有 edittext 和 button 和 recyclerview 我希望在单击按钮以搜索文本后在 recyclerview 中显示 json 数据 编辑文本。

问题是: 它工作正常,但我应该按我的编辑文本

这里是按钮点击监听代码:

searchBtn.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
 hospsAdapter = new hospsAdapter(getContext(), arrayList, HospitalFragment.this);

    
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(linearLayoutManager);



    recyclerView.setAdapter(hospsAdapter);
loadData()
}
}

在加载数据方法中,我在从 volley 获取 json 数据后调用此方法

public void updateList(ArrayList<HospitalsModel> list){
    if(hospsAdapter != null) {
        hospsAdapter.updateData(list);
    }
}

这是适配器代码:

 public class hospsAdapter extends RecyclerView.Adapter<hospsAdapter.OrdersViewHolder> {
    private Context context;
    private ItemClickHandler itemClickHandler;
    private List<HospitalsModel> orderDetailsList;
    HospitalsModel productsModel;
    

    public hospsAdapter(Context context, List<HospitalsModel> orderDetailsList , ItemClickHandler itemClickHandler) {

        this.context = context;
        this.itemClickHandler = itemClickHandler;
        this.orderDetailsList = new ArrayList<>(orderDetailsList);
               }

    public hospsAdapter() {
    }
    public interface ItemClickHandler{
        public void onItemClick(HospitalsModel productsModel);
    }

    @NonNull
    @Override
    public OrdersViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(context).inflate(R.layout.hosps_list_item, viewGroup, false);
        return new OrdersViewHolder(view);
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    public void onBindViewHolder(@NonNull OrdersViewHolder ordersViewHolder, int i) {
        HospitalsModel productsModel = orderDetailsList.get(i);
        Glide.with(context).load(productsModel.getImageUrl()).into(ordersViewHolder.appCompatImageView);
        ordersViewHolder.orderTv.setText(productsModel.getName());
        ordersViewHolder.orderTv2.setText("العنوان: "+productsModel.getAddress());
        ordersViewHolder.orderTv5.setText("متاح الان: نعم"+"");
        final int[] flag = {1};
        ordersViewHolder.appCompatImageView2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(flag[0] ==1) {
                    ordersViewHolder.appCompatImageView2.setImageDrawable(context.getDrawable(R.drawable.heart2));
                    flag[0] = 2;
                }else {
                    ordersViewHolder.appCompatImageView2.setImageDrawable(context.getDrawable(R.drawable.heart));
                    flag[0] =1;
                }


            }
        });
       ordersViewHolder.book.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
             dialPhoneNumber(productsModel.getOpenHo(),context);
           }
       });
        ordersViewHolder.map.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Uri gmmIntentUri = Uri.parse("geo:0,0?q=" +productsModel.getName());
                Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
                mapIntent.setPackage("com.google.android.apps.maps");
                if (mapIntent.resolveActivity(v.getContext().getPackageManager()) != null) {
                    v.getContext().startActivity(mapIntent);
                }
            }
        });




    }

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

    }
    public void updateData(List<HospitalsModel> movies) {
        orderDetailsList.clear();
        this.orderDetailsList = movies;
      notifyDataSetChanged();
    }
   
    public class OrdersViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
@BindView(R.id.order_img)
AppCompatImageView appCompatImageView;
        @BindView(R.id.fav_img)
        AppCompatImageView appCompatImageView2;
@BindView(R.id.order_tv4)
TextView orderTv2;
        @BindView(R.id.order_tv)
        TextView orderTv;
        @BindView(R.id.order_tv5)
        TextView orderTv5;
        @BindView(R.id.button_more)
        Button book;
        @BindView(R.id.button_map)
        Button map;
        public OrdersViewHolder(@NonNull View itemView) {
            super(itemView);
            ButterKnife.bind(this,itemView);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            int position = getAdapterPosition();
            HospitalsModel productsModel = orderDetailsList.get(position);
            itemClickHandler.onItemClick(productsModel);
        }
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

        public void dialPhoneNumber(String phoneNumber,Context context) {
        if(Build.VERSION.SDK_INT > 22) {
            if (ActivityCompat.checkSelfPermission(context, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling

                ActivityCompat.requestPermissions((DoctorsActivity)context, new String[]{Manifest.permission.CALL_PHONE}, 101);

                return;
            }

            Intent intent = new Intent(Intent.ACTION_CALL);
            intent.setData(Uri.parse("tel:" + phoneNumber));
            if (intent.resolveActivity(context.getPackageManager()) != null) {
                if (ActivityCompat.checkSelfPermission(context, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                    return;
                }
                context.startActivity(intent);
            }
        }else {
            Intent intent = new Intent(Intent.ACTION_CALL);
            intent.setData(Uri.parse("tel:" + phoneNumber));
            if (intent.resolveActivity(context.getPackageManager()) != null) {
                if (ActivityCompat.checkSelfPermission(context, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
                    return;
                }
               context.startActivity(intent);
            }
        }
    }
        }

我已经尝试了每个相关问题的所有内容,但没有任何改变 所以请帮助并告诉我为什么在android开发时会发生这个问题。 提前致谢。

【问题讨论】:

    标签: android android-studio android-recyclerview


    【解决方案1】:

    我终于找到了解决这个问题的方法 更新适配器列表后创建一个处理程序并刷新您的布局

    new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    getActivity().findViewById(R.id.recyclerView).invalidate();
                                    getActivity().findViewById(R.id.recyclerView).requestLayout();
                                }
                            },1500);
    

    【讨论】:

    • 您可以根据需要增加处理程序的持续时间
    • 对我来说,我将其设置为 3000 毫秒
    • 为什么会发生这种情况,因为在加载屏幕布局后查询正在加载数据。如果您将 recyclerview 高度保持为 match_parent 也将解决问题而不是使用处理程序,因为不推荐使用处理程序
    • @MohdQasim 我已将 recyclerview 的高度设置为 match_parent,但它仍然无法正常工作。
    • @Pooja 分享你的布局可能是 recyclerview 的父视图是 wrap_content
    【解决方案2】:

    您的代码中存在一些问题,请先尝试修复它们。

    1- 在onCreate(活动)或onViewCreated(片段)中初始化您的适配器和布局管理器。

    2- 只需在单击按钮时调用 loadData()

    3- 您的updateList(...) 必须在您的 UI 线程上调用

    4- 尝试清除 orderDetailsList 中的所有项目,然后在其上添加新项目

    无论如何,有更好的解决方案来处理这些事情,那就是 MVI 或 MVVM。 你可以从这里继续学习 Android Android Doc

    更新答案:

    你的适配器看起来不错,但是应用这两件事。

    1- 删除构造函数中的 List&lt;HospitalsModel&gt; orderDetailsList 参数并初始化 orderDetailsList 而不使用任何初始项。

    2- 尝试用这个替换updateData(...)

    public void updateData(List<HospitalsModel> movies) {
      orderDetailsList.clear();
      orderDetailsList.addAll(movies);
      notifyDataSetChanged();
    }
    

    【讨论】:

    • 嗨@Mehdi 感谢您的回复我将初始化代码移至 onCreateView 并且仅在 onClick 方法中调用 loadData() 并且我在填充之前清除了列表并从 getActivity.runOnUiThread 方法调用 updatelist 但没有更改,我之前尝试过这些解决方案,但除非关注edittext,否则recyclerview不会显示
    • 很明显,notifyDataSetChanged 在按下edittext之前不起作用,但我不知道为什么
    • 您提供的问题数据不足。 @ابانوبعاطف
    • 当我添加 list.addAll 时它什么也没显示,但是当我通过 = 运算符分配新的 arraylist 时,它不会显示数据,直到单击 edittext @Mehdi
    • 非常感谢@Mehdi 的关注和帮助
    猜你喜欢
    • 2017-11-25
    • 1970-01-01
    • 2012-03-06
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多