我有一个片段。它包括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?
答案 0 :(得分:0)
正如你所说,Volley是异步的,这意味着所有进程都将继续而不等待响应到达。调用getRadios方法时,会触发异步http请求,然后,几乎立即调用onCreateView方法,但这种情况发生得太快,以至于请求很可能仍在等待响应,因此,您的ArrayList将显示为空精确的时刻。
这就是为什么Volley有回调的原因。您需要处理响应的所有内容,请在onResponse方法中执行。在这种情况下,您尝试获取对象列表以创建适配器并将其设置为微调器;只需在onResponse回调中执行所有这些操作:创建适配器并在回调方法中设置适配器。