Данные не отображаются в recylerview, когда я нажимаю на меню параметров - PullRequest
0 голосов
/ 09 мая 2020

Обычно я получаю данные из API с помощью библиотеки volley и использую архитектуру Maven. Итак, в первый раз, когда приложение запускается, данные загружаются, но когда я хочу изменить данные после нажатия на меню опций, данные не будут отображаться на экране

MainActivity

    package com.example.movieappudacity;

    import androidx.appcompat.app.AppCompatActivity;
    import androidx.lifecycle.Observer;
    import androidx.lifecycle.Transformations;
    import androidx.lifecycle.ViewModelProviders;
    import androidx.recyclerview.widget.RecyclerView;
    import androidx.recyclerview.widget.StaggeredGridLayoutManager;

    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ProgressBar;
    import android.widget.Toast;

    import com.example.movieappudacity.Viewmodel.Viewmodel;

    import java.util.ArrayList;

    public class MainActivity extends AppCompatActivity
    {
    Button b;
    RecyclerView movieRecyclerview;
    RecyclerView.Adapter adapter;
    public static Context context;
    Viewmodel viewmodel;
    Button button;
    ArrayList<Model> arrayList=new ArrayList<>();
    ProgressBar progressBar;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context=MainActivity.this;
        movieRecyclerview=findViewById(R.id.movieRecycler);
        button=findViewById(R.id.but);
        progressBar=findViewById(R.id.progressbar);
        progressBar.setVisibility(View.VISIBLE);


        fetchMovies("popular");


    }

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        int id=item.getItemId();
        switch (id)
        {
            case R.id.mostPopular:
            {

                fetchMovies("popular");

                break;
            }
            case R.id.topRated:
            {
                progressBar.setVisibility(View.VISIBLE);
                fetchMovies("top_rated");
                break;
            }
        }
        return super.onOptionsItemSelected(item);
    }
    public void fetchMovies(String query)
    {
        movieRecyclerview.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL));
        movieRecyclerview.setHasFixedSize(true);
        viewmodel= ViewModelProviders.of(this).get(Viewmodel.class);
        viewmodel.setQuery(query);
        viewmodel.getMutableLiveData().observe(this, new Observer<ArrayList<Model>>() {
            @Override
            public void onChanged(ArrayList<Model> models)
            {
                arrayList.clear();
                Model model=models.get(1);
                Log.d("dataFromRepo",""+models.get(1)+"/"+model.getOriginalTitle());
                if (models.size()==0)
                {
                    Toast.makeText(getApplicationContext(),"No data found",Toast.LENGTH_SHORT).show();
                    return;
                }

                adapter=new Adapter(getApplicationContext(),models);
                movieRecyclerview.setAdapter(adapter);
                adapter.notifyDataSetChanged();
                progressBar.setVisibility(View.GONE);
            }
        });
        }
     }

Просмотр-модель

    package com.example.movieappudacity.Viewmodel;

    import android.content.Context;
    import android.graphics.LinearGradient;
    import android.util.Log;

    import androidx.lifecycle.LiveData;
    import androidx.lifecycle.MutableLiveData;
    import androidx.lifecycle.Transformations;
    import androidx.lifecycle.ViewModel;

    import com.example.movieappudacity.Model;
    import com.example.movieappudacity.Repositry.MovieRepositry;

    import java.util.ArrayList;

    public class Viewmodel extends ViewModel
    {
    LiveData<ArrayList<Model>> mutableLiveData;
    MutableLiveData<ArrayList<Model>> mutableLiveDataTop_Rated;
    MutableLiveData<String> queryMutable=new MutableLiveData<>();
    MovieRepositry repositry=null;
    public Viewmodel()
    {
        repositry=new MovieRepositry();
    }
    public void setQuery(String query)
    {
        queryMutable.setValue(query);
    }

    public LiveData<ArrayList<Model>> getMutableLiveData()
    {
        Log.d("uytr","int viewmodel");
        if (mutableLiveData==null)
        {
          //  Transformations.map(queryMutable,input -> repositry.getAllMovies(queryMutable.getValue()));
            mutableLiveData= Transformations.switchMap(queryMutable,input->repositry.getAllMovies(queryMutable.getValue()));
        }
        return mutableLiveData;
      }
     }

Репозиторий

    package com.example.movieappudacity.Repository;

    import android.app.Activity;
    import android.content.Context;
    import android.util.Log;
    import android.view.Display;
    import android.widget.Toast;

    import androidx.lifecycle.MutableLiveData;

    import com.android.volley.Request;
    import com.android.volley.RequestQueue;
    import com.android.volley.Response;
    import com.android.volley.VolleyError;
    import com.android.volley.toolbox.JsonObjectRequest;
    import com.android.volley.toolbox.Volley;
    import com.example.movieappudacity.MainActivity;
    import com.example.movieappudacity.Model;

    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;

    import java.util.ArrayList;

    import static com.example.movieappudacity.MainActivity.context;

    public class MovieRepositry
    {
    String call="";
    String API_KEY="";

    public MutableLiveData<ArrayList<Model>> getAllMovies(String query)
    {
        Log.d("lkjhb",""+query);
        API_KEY="https://api.themoviedb.org/3/movie/"+query+"?api_key=1f59ebe04c42625fc6c290dccb75e0d5&language=en-US&page=1";
        Log.d("qwert","In repo");
        final MutableLiveData<ArrayList<Model>> data = new MutableLiveData<>();
        final ArrayList<Model> arrayList=new ArrayList<>();
        JsonObjectRequest objectRequest=new JsonObjectRequest(Request.Method.GET, API_KEY, null, new Response.Listener<JSONObject>()
        {
            @Override
            public void onResponse(JSONObject response)
            {
                Log.d("iu4","inside json"+query);
                JSONArray jsonArray= null;
                try {
                    jsonArray = response.getJSONArray("results");
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                arrayList.clear();
                for (int i=0;i<jsonArray.length();i++)
                    {
                        JSONObject object= null;
                        try {
                            object = (JSONObject) jsonArray.get(i);
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        String original_name= null;
                        try {
                            original_name = object.getString("original_title");
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        String image_url= null;
                        try {
                            image_url = object.getString("poster_path");
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        String user_Rating= null;
                        try {
                            user_Rating = object.getString("vote_average");
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        String Relase_date= null;
                        try {
                            Relase_date = object.getString("release_date");
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        String overview= null;
                        try {
                            overview = object.getString("overview");
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        Model model=new Model(original_name,image_url,user_Rating,Relase_date,overview);
                        Log.d("poiy",""+query+"(("+model.getOriginalTitle());
                        arrayList.add(model);
                        Log.d("added","added sucess"+query);

                    }
                data.setValue(arrayList);

            }
        }, new Response.ErrorListener()
        {
            @Override
            public void onErrorResponse(VolleyError error)
            {
                Toast.makeText(context,"Something wrong",Toast.LENGTH_SHORT).show();
            }
        });
        RequestQueue requestQueue = Volley.newRequestQueue(context);
        requestQueue.add(objectRequest);
        return data;

    }

   }

4)Model

    package com.example.movieappudacity;

    public class Model
    {
    String originalTitle;
    String movieImage;
    String userRating;
    String RelaseDate;
    String overView;

    public Model(String originalTitle,String movieImage,String userRating,String RelaseDate,String overView)
    {
        this.originalTitle=originalTitle;
        this.movieImage=movieImage;
        this.userRating=userRating;
        this.RelaseDate=RelaseDate;
        this.overView=overView;
    }
    public Model()
    {

    }
    public String getOriginalTitle() {
        return originalTitle;
    }

    public void setOriginalTitle(String originalTitle) {
        this.originalTitle = originalTitle;
    }

    public String getMovieImage() {
        return movieImage;
    }

    public void setMovieImage(String movieImage) {
        this.movieImage = movieImage;
    }

    public String getUserRating() {
        return userRating;
    }

    public void setUserRating(String userRating) {
        this.userRating = userRating;
    }

    public String getRelaseDate() {
        return RelaseDate;
    }

    public void setRelaseDate(String relaseDate) {
        RelaseDate = relaseDate;
    }

    public String getOverView() {
        return overView;
    }

    public void setOverView(String overView) {
        this.overView = overView;
    }


    }

Адаптер

package com.example.movieappudacity;

import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.squareup.picasso.Picasso;

import java.util.ArrayList;

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder>
{
    ArrayList<Model> arrayList;
    Context context;
    Context getContext;
    public Adapter(Context context,ArrayList<Model> arrayList)
    {
        this.context=context;
        this.arrayList=arrayList;
    }

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

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position)
    {
        final Model model=arrayList.get(position);
        String url="https://image.tmdb.org/t/p/w500";
        Picasso.get().load(url+model.getMovieImage()).into(holder.movieImage);
        holder.movieImage.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Intent intent=new Intent(getContext,DetailActivity.class);
                intent.putExtra("title",model.getOriginalTitle());
                intent.putExtra("image",model.getMovieImage());
                intent.putExtra("releaseDate",model.getRelaseDate());
                intent.putExtra("userrating",model.getUserRating());
                intent.putExtra("overview",model.getOverView());
                getContext.startActivity(intent);
            }
        });


    }

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

    public class ViewHolder extends RecyclerView.ViewHolder
    {
        ImageView movieImage;
        public ViewHolder(@NonNull View itemView)
        {
            super(itemView);
            movieImage=itemView.findViewById(R.id.movie_image);
        }
    }
}
...