【问题标题】:I am not able to call recyclerview adapter's functions我无法调用 recyclerview 适配器的功能
【发布时间】:2019-08-27 06:38:50
【问题描述】:

我在 MainActivity 中有一个名为 CustomAdapter 的 recyclerView 适配器,我通过解析 JSON 来获取数据,这些数据用于在 CustomAdapter 类中设置 textview。

当我启动我的应用程序时,我没有显示 recyclerView 列表,也没有调用适配器。所以我的问题是我无法调用 customAdapter 的函数,如 onBindViewHolder、onCreateViewHolder。

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

        Context context;
        RealmResults<Film> realmResults;
        View.OnTouchListener listener;
        Realm realm;

        public CustomAdapter(Context context, View.OnTouchListener listener) {
            this.context = context;
            this.listener = listener;
        }

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

            View root = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_liste, parent, false);
            MyViewHolder viewHolder = new MyViewHolder(root);
            return viewHolder;
        }

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

            Realm.init(context);
            RealmResults<Film> films = realm.where(Film.class).findAll();
            Film f = films.get(position);

            for(film film:filmler) {
                try {
                    holder.title.setText(film.getTitle());
                    holder.year.setText(film.getYear());
                    holder.poster.setImageURI(film.getPoster());

                    if (film.getPoster().toString().equals("N/A") == true) {
                        Picasso.get().load(R.drawable.noImage).fit().into(holder.image);
                    } else {
                        Picasso.get().load(film.getPoster()).into(holder.image);
                    }

                } catch (NullPointerException e) {
                    e.printStackTrace();
                }
            }
    @Override
        public int getItemCount() {

            if(realmResults==null)
            {
                return 0;
            }
            return realmResults.size();
        }

        public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnTouchListener {

            public TextView title, year;
            public ImageView image;
            public LinearLayout linearLayout;

            public MyViewHolder(@NonNull View itemView) {
                super(itemView);
                title = itemView.findViewById(R.id.title_id);
                year = itemView.findViewById(R.id.year_id);
                image = itemView.findViewById(R.id.image_id);
                linearLayout = itemView.findViewById(R.id.linearlayout_id);
                linearLayout.setOnTouchListener(listener);
            }

            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if(motionEvent.getAction() == MotionEvent.ACTION_SCROLL){
                    return true;
                }
                return false;
            }
        }
    }

我的 MainActivity 类:

final StringRequest stringRequest1 = new StringRequest(Request.Method.GET, url1, new Response.Listener<String>() {
  @Override
  public void onResponse(String response) {
          progressDialog.dismiss();
          JSONObject jsonObject1 = new JSONObject(response);
          String response = jsonObject1.getString("Response");

          if (response.equals("True") && jsonObject1.has("Search")==true) {

          JSONArray array1 = jsonObject1.getJSONArray("Search");
          for (int i = 0; i < array1.length(); i++) {

          final JSONObject films = array1.getJSONObject(i);

           realm1.executeTransactionAsync(new Realm.Transaction() {
              @Override
              public void execute(Realm realm1) {
                Film film = realm1.createObject(Film.class);
                  try {        
                       film.setTitle(filmler.getString("Title"));                                     
                       film.setYear(filmler.getString("Year"));                                 
                       film.setPoster(filmler.getString("Poster"));
                       realm1.copyToRealm(film);
                       } catch (JSONException e) {
                         e.printStackTrace();
                       }
                       }
                });

            }

             for (int j = 0; j < array1.length(); j++) {
                array1.remove(j);
             }
             adapter = new CustomAdapter(this, this);
             recycle1.setAdapter(adapter);

【问题讨论】:

  • 将回收站视图的可见性设置为消失..
  • 完整的代码,带有您在 recyclerView 中添加适配器的屏幕
  • 我添加了 MainActivity 代码。回收站视图可见性可见
  • 在收到服务器响应后,您似乎没有从 Activity 更新 realmResults。
  • @Dhaval 我如何更新 realmResults ?我曾经是“realm1.copyToRealm(film_ozellik);”

标签: android android-recyclerview realm custom-adapter realm-mobile-platform


【解决方案1】:

你在 onBindViewHolder 中出错了。 尝试在构造函数中传递列表

   public CustomAdapter(Context context, View.OnTouchListener 
                                 listener,RealmResults<film> realmResults) {
        this.context = context;
        this.listener = listener;
        this.realmResults = realmResults;
    }

并从 bindViewHolder 中删除此代码

        Log.d(TAG, "onBindViewHolder : called.");
        Realm.init(context);
        //film filmler = filmList.get(position);
        //realm = Realm.getDefaultInstance();
        RealmResults<film> filmler = 
        realm.where(film.class).findAll();
        film f = filmler.get(position);

不要在 onBindViewHolder 中调用 for 循环来设置数据,只需执行以下操作

        @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, final int 
        position) {
                 film item = realmResults.get(position);
                 if(item!=null && item.isValid()){
                       holder.baslik.setText(item.getTitle());
                holder.yil.setText(item.getYear());
                holder.resim.setImageURI(item.getPoster());

                if (item.getPoster().toString().equals("N/A")) {
                    Picasso.get().load(R.drawable.resimyok).fit().into(holder.resim);
                } else {

              Picasso.get().load(film.getPoster()).into(holder.resim);
                }
                 }
            }

在下面修复此问题以获得响应并将其保存到领域

          JSONArray array1 = jsonObject1.getJSONArray("Search");
                    Realm realm = Realm.getDefaultInstance();
                    realm.beginTransaction();
                    realm.createOrUpdateAllFromJson(filn.class, array1);
                    realm.commitTransaction();

                    //get all saved data from realm
                    RealmResults<T> results = 
                      realm.where(film.class).query.findAll();
                    adapter = new 
             CustomAdapter(getApplicationContext(),MainActivity.this,results);
                    recycle1.setAdapter(adapter);
                    arama.getText().clear();

【讨论】:

  • 我在 onCreate 方法,MainActivity 类中添加了这个。
  • 感谢您的回答。我可以在 MainActivity 中设置 realmResult 吗?我只分配领域对象@govind-prajapati
  • 是的,您可以在设置适配器的 MainActivity 中获取领域列表,然后像我在回答中显示的那样传递给 CustomAdapter。
  • 如何使用领域对象设置 realmResult?我的领域对象已满,但领域结果为空
  • 我再次更新获取响应的代码并将其设置到适配器中
猜你喜欢
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多