2017-09-27 16 views
0

私のアプリでは、並べ替えを追加しようとしています:人気度、最高定格などで並べ替えようとしています。 AlertDialogの並べ替えオプション。アダプタデータを変更した後にGridViewを更新する方法

私の問題は、私は次のことを試してみましたが、それは動作しませんGridViewによってソートするオプションを選択するとImageView

を更新したり、変更しないということです。)

adapter.notifyDataSetChanged(; gridView.invalidateViews();

import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.graphics.Point; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.annotation.BoolRes; 
import android.support.annotation.Nullable; 
import android.support.v4.app.Fragment; 
import android.support.v7.app.AlertDialog; 
import android.util.Log; 
import android.view.Display; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.WindowManager; 
import android.widget.AdapterView; 
import android.widget.GridView; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.android.volley.Request; 
import com.android.volley.Response; 
import com.android.volley.VolleyError; 
import com.android.volley.toolbox.JsonArrayRequest; 
import com.android.volley.toolbox.JsonObjectRequest; 
import com.android.volley.toolbox.StringRequest; 

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

import java.util.ArrayList; 


/** 
* Created by macbook on 9/18/17. 
*/ 

public class MoviesFragment extends Fragment implements AdapterView.OnItemClickListener { 

    static GridView gridView; 
    static int width; 
    static ArrayList<String> posters; 
    private final static String API_KEY = "0000000000000000000"; 

    final static String URL_BASE = "https://api.themoviedb.org/3/movie/"; 
    static String url_sorted ="popular?api_key=" ; 
    ImageAdapter adapter; 

    public MoviesFragment() 

    { 

    } 


    // inflate view and init grideView with set adapter 
     @Nullable 
     @Override 
     public View onCreateView (LayoutInflater inflater, @Nullable ViewGroup 
     container, @Nullable Bundle savedInstanceState){ 
     View view = inflater.inflate(R.layout.movies_fragment, container, false); 

      setHasOptionsMenu(true); 


      // getwidth 
     WindowManager wm = (WindowManager) getActivity().getSystemService(Context.WINDOW_SERVICE); 
     Display display = wm.getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 

      if(MainActivity.TABLET) 
      { 

       width = size.x/6; 

      }else 
      { 

       width = size.x/2; 

      } 


     if(getActivity() != null) 
     { 




      posters = new ArrayList<String>(); 

      adapter = new ImageAdapter(getActivity(),posters,width); 
      gridView = (GridView)view.findViewById(R.id.grideView); 
      gridView.setAdapter(adapter); 
      gridView.setColumnWidth(width); 
      gridView.setOnItemClickListener(this); 

     } 


     return view; 
    } 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

     Toast.makeText(getActivity(),position+"",Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 


     getActivity().setTitle("Most Popular Movies"); 
     loadPoster(url_sorted); 





} 
    public void loadPoster(String url) { 

     if (isNetworkAvailable()) { 
      gridView.setVisibility(View.VISIBLE); 


      getJsonImageUrl(url); 



     } else { 


      gridView.setVisibility(View.GONE); 

      TextView text = new TextView(getActivity()); 
      RelativeLayout relativeLayout = (RelativeLayout) getActivity().findViewById(R.id.relative); 
      text.setText("no Internet Connection..."); 

      relativeLayout.addView(text); 


     } 


    } 





    private boolean isNetworkAvailable() { 
     ConnectivityManager connectivityManager 
       = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
     return activeNetworkInfo != null && activeNetworkInfo.isConnected(); 
    } 


     public Boolean getJsonImageUrl(String urlSort) 
     { 

      Toast.makeText(getActivity(),urlSort,Toast.LENGTH_LONG).show(); 


      JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, URL_BASE + urlSort+ API_KEY, null, new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 

        int count = 0 ; 




        JSONArray obj = null; 
        try { 
         obj = response.getJSONArray("results"); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 


        while(count <obj.length()) 
        { 



         JSONObject jsonObject = null; 
         String imgURL = null; 
         try { 

          jsonObject = obj.getJSONObject(count); 
          imgURL = jsonObject.getString("poster_path"); 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
         posters.add(imgURL); 
         count++; 


        } 

       } 
      }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 

        Toast.makeText(getActivity(),"ERROR",Toast.LENGTH_LONG).show(); 

       } 
      } 
      ); 

      Mysingleton.getInstence(getContext()).addToRequestque(jsonObjectRequest); 


      return true; 

     } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     inflater.inflate(R.menu.menu, menu); 

    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     switch (item.getItemId()) 
     { 
      case R.id.preferncesMenu: 



       break; 

      case R.id.filter: 

       // Intent i = new Intent(getActivity().getApplication(),SettingAactivity.class); 
       //startActivity(i); 
       showSortDialog(); 


       break; 

     } 


     return false; 
    } 

    private void showSortDialog() { 
     final CharSequence[] sortBy = new String[] {"Popular", "Top Rated","Latest","Upcoming","Now playing"}; 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setTitle("Sort by"); 
     builder.setSingleChoiceItems(sortBy, -1, new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 

         String newUrl; 
         gridView.setAdapter(null); 

         switch(which) 
         { 

          case 0: 

           newUrl = "popular?api_key="; 
           getActivity().setTitle("Most Popular Movies"); 
           //loadPoster(newUrl); 


           break; 

          case 1: 


           newUrl = "top_rated?api_key="; 
           getActivity().setTitle("Top Rated Movies"); 
           adapter.notifyDataSetChanged(); 
           gridView.invalidateViews(); 
           loadPoster(newUrl); 

           Toast.makeText(getActivity(),newUrl,Toast.LENGTH_LONG).show(); 



           dialog.dismiss(); 

           break; 

          case 2: 

           url_sorted = "latest?api_key="; 

           getActivity().setTitle("latest Movies"); 

           break; 

          case 3: 

           url_sorted = "upcoming?api_key="; 
           getActivity().setTitle("UpComing Movies"); 

           break; 

          case 5: 

           url_sorted = "now_playing?api_key="; 

           getActivity().setTitle("Now Playing Movies"); 

           break; 
         } 

        } 
       }); 
       builder.create().show(); 
     } 
} 
+0

GridLayoutManagerでrecyclerViewを使用するとどうなりますか?私はそれがあなたが望むものになるだろうと思う。 – March3April4

+0

GrideViewの問題と、なぜRecyclerView with GridLayoutManagerが役立つのでしょうか? – hackour

答えて

0

問題は非UIスレッドからnotifyDataSetChanged()を呼び出すことでした。

ので後(notifyDataSetChangedを呼び出す)UIから完全に

その作業をスレッドコード:

public void refresh() 
    { 
     new Handler(Looper.getMainLooper()).post(new Runnable() { 
      @Override 
      public void run() { 
       adapter.notifyDataSetChanged(); 
       gridView.invalidate(); 
      } 
     }); 

    } 
1

基本的に、アダプタ内には、データオブジェクトを渡したり更新したりするメカニズムが必要です。

新しいデータが利用可能になったときに呼び出されるアダプタクラス内にメソッドを追加します。あなたは、新しいデータを受け取った後

public void swapItems(List<Item> itemsList){ 
    mItemsList.clear(); 
    mItemsList.addAll(itemsList); 
    notifyDataSetChanged(); 
} 

は、その後、あなたの活動から、ちょうどあなたのアダプタインスタンスからこのメソッドを呼び出します。

adapter.swapItems(newItemsList); 

データタイプに合わせて上記のコードを変更してください。しかし、それは基本的にどのように行われているのですか? Androidのデータバインディングをより魅力的なものにしたい場合は、

+0

私はまだ同じ問題を試みます – hackour

0

私はあなたがnullにアダプタを設定した後、あなたがnotifyDataSetChanged呼び出しを参照してください。なぜアダプターをnullに設定し、それを使用しようとするのか分かりません。更新されていないデータだけでなく、クラッシュする必要があります。

あなたのgetjson呼び出しの後に、あなたが持っているすべての新しい項目を表示するためにnotifyDataSetChangedを呼び出す必要があります。ソートがソート順を変更する場合は、ソートをリストに実装してから、notifyDataSetChangedをもう一度呼び出す必要があります。

なぜあなたはそれを無効にしているのか分かりません。あなたがこれを行うなら、あなたは大丈夫でしょう。

関連する問題