Обычно я получаю данные из 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);
}
}
}