android - 从 fragment 的适配器中使用毕加索获取图像

标签 android android-fragments

我有一个 recycleview,它使用包含 textview 和 imageview 的自定义适配器从 api 获取数据,我在 Activity 中实现了它,它工作正常,但现在我尝试使用 fragment 而不是 activity,除了将代码移动到 fragment 后未显示的图像,所以这是我的 fragment :

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()));

猫在 textview 中仍然显示良好,但带有 picasso 库的图像不再显示,我阅读了很多解决方案,例如将上下文从 fragment 传递到适配器,但没有任何效果!

这是调试图像: enter image description here

enter image description here

enter image description here

enter image description here

最佳答案

viewgroup.getContext() 需要的不是上下文,而是来自 fragment 或 Activity 的上下文。

@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);

}

关于android - 从 fragment 的适配器中使用毕加索获取图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51135242/

相关文章:

android - (colorPrimaryDark) 状态栏颜色在 android v21 上不起作用?

java - Android ViewPager 指南

android - 我们如何创建标记?我们可以使用它来获取使用增强现实的相机 View 中显示的建筑物的位置吗?

android - 从我的 ListFragment 中删除 fragment

android - 扩展 MapFragment Android

Android - 由于权限被禁用,应用程序被操作系统强制关闭后,应用程序在重新启动时崩溃

android - 附近的连接没有 ConnectionResponseCallback

java - 如何在Fragment中调用requestWindowFeature

android fragment 在恢复时崩溃

android - 在android中的ListView上显示不同的图标