使用Volley从onCreateview获取数据对象

时间:2017-10-16 16:38:05

标签: android android-recyclerview android-volley

我有一个片段。它包括Recycler.ViewHolder,Recycler.Adapter和Volley。

public class FirstRadiosFragment extends Fragment {

private final static String TAG = FirstRadiosFragment.class.getName();

private TextView mRadiosName;
private RecyclerView mSpinner;

private List<Radios> mRadiosList;
private Radios mRadios;

private SpinnerAdapter mSpinnerAdapter;
private StaggeredGridLayoutManager mLayoutManager;
private ProgressBar mProgressBar;
private Button mPlayRadio, mStopRadio;
private Toast mToast;


@Override
public void onAttach(Context context) {
    super.onAttach(context);
    getRadios();

}

/**
 * I saved fragment layout view!
 */



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fr_activity_main_radio, container, false);

    mRadiosName = (TextView) view.findViewById(R.id.id_fr_radios_name_fr);
    mSpinner = (RecyclerView) view.findViewById(R.id.id_fr_spinner);
    mSpinner.setHasFixedSize(true);
    mProgressBar = (ProgressBar) view.findViewById(R.id.radioProgress);
    mProgressBar.setMax(100);
    mProgressBar.setVisibility(View.INVISIBLE);
    mRadiosList = new ArrayList<Radios>();
    Log.d(TAG, "mRadiosList ---------->: " + mRadiosList.size()); //returns null





    mLayoutManager = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.HORIZONTAL);
    mSpinner.setLayoutManager(mLayoutManager);


    mSpinnerAdapter = new SpinnerAdapter(getActivity(), mRadiosList);

    mStopRadio = (Button) view.findViewById(R.id.btnStop);
    mSpinner.setAdapter(mSpinnerAdapter);


    return view;
}


/**
 * Custom Holder For RecyclerView 
 * I will get ArrayList data
 */

private class RadioHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    private TextView mRadioassName;
    public MediaPlayer mediaPlayer;
    private Radios mRadios = new Radios();

    public RadioHolder(LayoutInflater inflater, ViewGroup view) {
        super(inflater.inflate(R.layout.item_for_spinner, view, false));
        mRadioassName = (TextView) itemView.findViewById(R.id.id_items_radios_name);
        itemView.setOnClickListener(this);


    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    public void bind(final Radios radios) {
        mRadiosName.setText(radios.getRadioName()); 
    }


    private void startPlaying() {

        mProgressBar.setVisibility(View.VISIBLE);
        mProgressBar.setIndeterminate(true);
        mStopRadio.setVisibility(View.VISIBLE);


        mediaPlayer.prepareAsync();

        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {

                mediaPlayer.start();
            }
        });
    }

    private void stopPlaying(Radios radios) {
        if (mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
            mediaPlayer.release();
            initMediaplayer(radios);
        }

        mStopRadio.setEnabled(false);
        mProgressBar.setIndeterminate(true);
        mProgressBar.setVisibility(View.INVISIBLE);
    }

    private void initMediaplayer(Radios radios) {

        if (mToast != null) {
            mToast.cancel();
        }

        mediaPlayer = new MediaPlayer();
        mRadioassName.setText(radios.getRadioURL());

        try {

            mediaPlayer.setDataSource(radios.getRadioURL());

            Log.d(TAG, "initMediaplayer: " + radios.getRadioURL());
        } catch (IOException e) {

            e.printStackTrace();

        } catch (IllegalStateException e) {
            e.printStackTrace();
        }
        mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
            @Override
            public void onBufferingUpdate(MediaPlayer mediaPlayer, int percent) {
                mProgressBar.setIndeterminate(false);
                mProgressBar.setSecondaryProgress(100);
                Log.d(TAG, "Buffering ----> : " + percent);
            }
        });
        mediaPlayer.setOnInfoListener(new MediaPlayer.OnInfoListener() {
            @Override
            public boolean onInfo(MediaPlayer mediaPlayer, int i, int i1) {
                if (i == 703 || i == 701) {
                    String InfoMsg = "Bandwith is not strong !";
                    mToast = Toast.makeText(getContext(), InfoMsg, Toast.LENGTH_SHORT);
                    mToast.show();
                }
                return false;
            }
        });
        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                String CompMesg = "Success !";
                mToast = Toast.makeText(getContext(), CompMesg, Toast.LENGTH_SHORT);
                mToast.show();
            }
        });
    }

    @Override
    public void onClick(View view) {

        int position = getPosition();
        Log.d(TAG, "PlayState" + position);
        Toast.makeText(getContext(), "Staring...", Toast.LENGTH_SHORT).show();
        startPlaying();

    }
}

/**
 * Adapter
 */

private class SpinnerAdapter extends RecyclerView.Adapter<RadioHolder> {

    Context mContext;


    public SpinnerAdapter(Context context, List<Radios> radios) {
        mContext = context;
        mRadiosList = radios;
    }

    @Override
    public RadioHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inf = LayoutInflater.from(getActivity());
        return new RadioHolder(inf, parent);
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public void onBindViewHolder(final RadioHolder holder, final int position) {
        final Radios radios = mRadiosList.get(position);
        holder.bind(radios);
        holder.initMediaplayer(radios);
    }


    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public int getItemCount() {
        return mRadiosList.size(); //not null
    }


}


// Request !!

public void getRadios() {

    StringRequest mRequestRadios = new StringRequest(Request.Method.POST, RadiosAmigos.URL_RADIOS, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            try {
                JSONObject jsonObject = new JSONObject(response);
                JSONArray jsonArray = jsonObject.getJSONArray("radios");
                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject obj = jsonArray.getJSONObject(i);
                    Radios radios = new Radios();
                    radios.setRadioID(obj.getInt("id"));
                    radios.setRadioName(obj.getString("radio_name"));
                    radios.setRadioURL(obj.getString("radio_url"));

                    mRadiosList.add(radios);
                    mSpinnerAdapter.notifyDataSetChanged();
                }


            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });
    RadiosAmigosConfig.getmInstance().addToRequestQueue(mRequestRadios);

} }

我的申请有效。 我知道Volley是异步HTTP请求。但是我从getRadios()方法获得的mRadioList在OnCreateView中调用时返回null。但是,我完全从Recycler.Adapter获取mRadioList。 我不明白,为什么我不能在onCreateView中获得mRadioList?

1 个答案:

答案 0 :(得分:0)

正如你所说,Volley是异步的,这意味着所有进程都将继续而不等待响应到达。调用getRadios方法时,会触发异步http请求,然后,几乎立即调用onCreateView方法,但这种情况发生得太快,以至于请求很可能仍在等待响应,因此,您的ArrayList将显示为空精确的时刻。

这就是为什么Volley有回调的原因。您需要处理响应的所有内容,请在onResponse方法中执行。在这种情况下,您尝试获取对象列表以创建适配器并将其设置为微调器;只需在onResponse回调中执行所有这些操作:创建适配器并在回调方法中设置适配器。