Android GridLayoutManager 和 CustomAdapter 在使用 "this" 调用自身时出错

Android GridLayoutManager and CustomAdapter have error when using "this" to call themself

我想解析 JSON 并在 Android 中用 RecyclerView 和 CardView 显示。我有一个 tabHost 菜单,它有三个片段活动。我将 CardView 的所有代码都放入其中一个片段中,但是当我使用 "this" 调用 GridLayoutManager 和 CustomAdapter 时代码出现错误。

这是片段activity中的代码,错误在onViewCreated:

final TextView tv = (TextView) view.findViewById(R.id.tv); adapter = new CustomAdapter(this,data_list);

错误信息是:

Error:(75, 51) error: incompatible types: Tab2Fragment cannot be converted to Context, GridLayoutManager(android.content.Context, int) in GridLayoutManager cannot applied to (com.xxx.xxx.xxx.Tab2Fragment)

public class Tab2Fragment extends Fragment {

private RecyclerView recyclerView;
private GridLayoutManager gridLayoutManager;
private CustomAdapter adapter;
private List<MyData> data_list;

public Tab2Fragment() {
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

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

}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    SharedPreferences settings = this.getActivity().getSharedPreferences("user", Context.MODE_PRIVATE);
    String username = settings.getString("username","default"); // get back the stored share preferences
    final TextView tv = (TextView) view.findViewById(R.id.tv);
    recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
    data_list  = new ArrayList<>();
    load_data_from_server(username);

    gridLayoutManager = new GridLayoutManager(this,2);
    recyclerView.setLayoutManager(gridLayoutManager);

    adapter = new CustomAdapter(this,data_list);
    recyclerView.setAdapter(adapter);


}

private void load_data_from_server(final String username) {

    AsyncTask<String,Void,Void> task = new AsyncTask<String, Void, Void>() {
        @Override
        protected Void doInBackground(String... strings) {

            OkHttpClient client = new OkHttpClient();
            Request request = new Request.Builder()
                    .url("http://www.tootcards.com/instaidea/cardapi.php?username="+strings[0])
                    .build();
            try {
                Response response = client.newCall(request).execute();

                JSONArray array = new JSONArray(response.body().string());

                for (int i=0; i<array.length(); i++){

                    JSONObject object = array.getJSONObject(i);

                    MyData data = new MyData(object.getInt("shop_id"),object.getString("shop_name"),
                            object.getString("cardimg"));

                    data_list.add(data);
                }



            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                System.out.println("End of content");
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            adapter.notifyDataSetChanged();
        }
    };

    task.execute(username);
}


@Override
public void onDetach() {
    super.onDetach();
}

}

CustomAdapter.java中的代码:

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {

private Context context;
private List<MyData> my_data;

public CustomAdapter(Context context, List<MyData> my_data) {
    this.context = context;
    this.my_data = my_data;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.card,parent,false);

    return new ViewHolder(itemView);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {

    holder.description.setText(my_data.get(position).getDescription());
    Glide.with(context).load(my_data.get(position).getImage_link()).into(holder.imageView);

}

@Override
public int getItemCount() {
    return my_data.size();
}

public  class ViewHolder extends  RecyclerView.ViewHolder{

    public TextView description;
    public ImageView imageView;

    public ViewHolder(View itemView) {
        super(itemView);
        description = (TextView) itemView.findViewById(R.id.description);
        imageView = (ImageView) itemView.findViewById(R.id.image);
    }
}
}

myData.java中的代码:

class MyData {
private int id;
private String description, image_link;

public MyData(int id, String description, String image_link) {
    this.id = id;
    this.description = description;
    this.image_link = image_link;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getImage_link() {
    return image_link;
}

public void setImage_link(String image_link) {
    this.image_link = image_link;
}
}

如有任何帮助,我们将不胜感激。

改变

this

getActivity()

试试这个

 final TextView tv = (TextView) view.findViewById(R.id.tv); adapter = new CustomAdapter(getActivity(), data_list);

final TextView tv = (TextView) view.findViewById(R.id.tv); adapter = new CustomAdapter(getContext(), data_list);