繁体   English   中英

更改适配器数据后如何更新GridView

[英]How to update GridView after changing adapter data

在我的应用程序中,我试图通过AlertDialog中的排序选项添加排序,例如:按热门排序,评分最高等。

我的问题是选择按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();
        }
}

基本上,在适配器内部,您需要具有传入/更新数据对象的机制。

在适配器类中添加一个方法,当有新数据可用时将调用该方法。

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

然后,从您的活动中,收到新数据后,只需从适配器实例调用此方法。

adapter.swapItems(newItemsList);

只需更改上面的代码以匹配您的数据类型即可。 但这基本上就是完成的方式。 而且,如果您想更加时尚,请探索Android数据绑定。

问题是从非UI线程调用notifyDataSetChanged()。

因此,从UI线程调用notifyDataSetChanged()之后,它的工作非常完美

码:

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

    }

将适配器设置为null后,我只会看到您调用notifyDataSetChanged。 我不确定为什么要将适配器设置为null,然后尝试使用它。 您应该崩溃了,而不仅仅是看到未更新的数据。

在getjson调用之后,您应该调用notifyDataSetChanged来显示您获得的所有新项目。 如果sort要更改排序顺序,则应在列表上实现排序,然后再次调用notifyDataSetChanged。

我不确定为什么要取消它。 如果这样做,则应该没问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM