У меня есть recycleview, который извлекает данные из API с помощью специального адаптера, содержащего textview и imageview, и я реализовал это в Activity, и он отлично работает, но теперь я попытался использовать фрагмент вместо Activity, и все работает нормально, кроме изображения, которые не отображаются после перемещения кода во фрагмент, так что это мой фрагмент:
public class TVFragment extends Fragment implements TVAdapter.TVAdapterOnClickHandler {
TVAdapter mAdapter;
RecyclerView mSportsList;
String sortsports="sports.php";
Context mContext ;
public static TVFragment newInstance() {
TVFragment fragment = new TVFragment();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_tv, container, false);
mSportsList = (RecyclerView) view.findViewById(R.id.rv_sports);
mContext = getActivity();
GridLayoutManager LayoutManagerSports = new GridLayoutManager(getActivity(), 3);
mSportsList.setLayoutManager(LayoutManagerSports);
mSportsList.setHasFixedSize(true);
mAdapter = new TVAdapter(this, mContext);
mSportsList.setAdapter(mAdapter);
loadTVData(sortsports);
return view;
}
private void loadTVData(String sortChannels) {
showTVDataView();
new FetchTVTask().execute(sortChannels);
}
@Override
public void onClick(TVItem channel) {
Context context = getActivity().getApplicationContext();
Class destinationClass = TVChannel.class;
Intent intentToStartDetailActivity = new Intent(context, destinationClass);
intentToStartDetailActivity.putExtra("TVChannel", channel);
startActivity(intentToStartDetailActivity);
}
private void showTVDataView() {
mSportsList.setVisibility(View.VISIBLE);
}
public class FetchTVTask extends AsyncTask<String, Void, ArrayList<TVItem>> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected ArrayList<TVItem> doInBackground(String... params) {
if (params.length == 0) {
return null;
}
String sortChannels = params[0];
URL channelRequestUrl = NetworkTV.buildUrl(sortChannels);
try {
String jsonTVResponse = NetworkTV.getResponseFromHttpUrl(channelRequestUrl);
ArrayList<TVItem> simpleJsonTVData = JsonTV.getSimpleTVStringsFromJson(getContext(), jsonTVResponse);
return simpleJsonTVData;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(ArrayList<TVItem> TVData) {
if (TVData != null) {
showTVDataView();
mAdapter.setTVData(TVData);
} else {
}
}
}
}
тогда это мой адаптер:
public class TVAdapter extends RecyclerView.Adapter<TVAdapter.RecyclerViewHolder> {
ArrayList<TVItem> mChannelItems;
private Context mContext;
private final TVAdapter.TVAdapterOnClickHandler mClickHandler;
public interface TVAdapterOnClickHandler {
void onClick(TVItem channel);
}
public TVAdapter(TVAdapterOnClickHandler clickHandler, Context context) {
this.mContext = context;
mClickHandler = clickHandler;
}
class RecyclerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public final TextView Cat;
public final ImageView Image;
public RecyclerViewHolder(View view) {
super(view);
Cat = (TextView)itemView.findViewById(R.id.channel_cat);
Image = (ImageView) itemView.findViewById(R.id.channel_image);
view.setOnClickListener(this);
}
@Override
public void onClick(View v) {
int adapterPosition = getAdapterPosition();
TVItem channel = mChannelItems.get(adapterPosition);
mClickHandler.onClick(channel);
}
}
@Override
public TVAdapter.RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
mContext = viewGroup.getContext();
int layoutIdForListItem = R.layout.tv_list_item;
LayoutInflater inflater = LayoutInflater.from(mContext);
boolean shouldAttachToParentImmediately = false;
View view = inflater.inflate(layoutIdForListItem, viewGroup, shouldAttachToParentImmediately);
return new TVAdapter.RecyclerViewHolder(view);
}
@Override
public void onBindViewHolder(TVAdapter.RecyclerViewHolder holder, int position) {
Picasso.with(mContext).load(mChannelItems.get(position).getFullImagePath()).resize(500,500).placeholder(R.drawable.placeholder).error(R.drawable.placeholder).into(holder.Image);
holder.Cat.setText(String.valueOf(mChannelItems.get(position).getTitle()));
}
@Override
public int getItemCount() {
if (null == mChannelItems)
return 0;
else {
return mChannelItems.size();
}
}
public void setTVData(ArrayList<TVItem> TVData) {
mChannelItems = TVData;
notifyDataSetChanged();
}
}
Вы можете увидеть эти строки:
Picasso.with(mContext).load(mChannelItems.get(position).getFullImagePath()).resize(500,500).placeholder(R.drawable.placeholder).error(R.drawable.placeholder).into(holder.Image);
и
holder.Cat.setText(String.valueOf(mChannelItems.get(position).getTitle()));
кот по-прежнему хорошо отображается в текстовом виде, но изображения с библиотекой Пикассо больше не отображаются, и я прочитал множество решений, таких как передача контекста из фрагмента в адаптер, но ничего не получается!
это отладочные изображения: