получать изображения с помощью Picasso в адаптере из фрагмента - PullRequest
0 голосов
/ 02 июля 2018

У меня есть 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()));

кот по-прежнему хорошо отображается в текстовом виде, но изображения с библиотекой Пикассо больше не отображаются, и я прочитал множество решений, таких как передача контекста из фрагмента в адаптер, но ничего не получается!

это отладочные изображения: enter image description here

enter image description here

enter image description here

enter image description here

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Почему вы присваиваете значение mContext дважды? Попробуйте удалить mContext = viewGroup.getContext(); из кода.

0 голосов
/ 02 июля 2018

viewgroup.getContext () Не нужен контекст, но контекст из фрагмента или действия.

@Override
public TVAdapter.RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    //mContext = viewGroup.getContext(); This should fix it. You already init mContext in the constructor.
    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);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...