有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

我的DataReader类存在java问题

为了获取数据,我的自定义类遇到了一些麻烦。我已经为从web服务获取数据创建了一个自定义类,当我尝试使用我的单例类时会出现问题,如果我使用DataReader.getInstance(getContext(), this),我的listview只在应用程序启动时第一次填充。但如果我使用DataReader的新实例,随时都可以正常工作

下面是我的DataReader类:

public class DataReader {
private static DataReader singleton;
private Context context;
private Data_Listener data_listener;

public DataReader(Context context, Data_Listener data_listener) {
    this.context = context;
    this.data_listener = data_listener;
}

public static synchronized DataReader getInstance(Context context, Data_Listener data_listener) {
    if (singleton == null) {
        singleton = new DataReader(context, data_listener);
    }

    return singleton;
}

public void Categorias_fill(){
    final ArrayList<Object> objects = new ArrayList<>();
    API.getInstance(context).unAuthenticateArrayRequest(Request.Method.GET, context.getString(R.string.endpoint_categorias), null, new API_Listener() {
        @Override
        public void OnSuccess(JSONObject response) {

        }

        @Override
        public void OnSuccess(JSONArray response) throws JSONException {
            Gson gson = new Gson();
            Categoria categoria;
            for(int i = 0;i < response.length(); i++) {
                categoria = gson.fromJson(response.getJSONObject(i).toString(), Categoria.class);
                objects.add(categoria);
            }
            data_listener.onBindData(objects);
        }

        @Override
        public void OnError(String error) {
            data_listener.onBindData(objects);
        }

    });
}

下面是我如何使用DataReader:

public class CategoriasFragment extends Fragment implements Data_Listener{
private Categorias_Adapter adapter;
private ArrayList<Categoria> list = new ArrayList<>();
private ExpandableListView listView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_categorias, container, false);
    listView = (ExpandableListView) view.findViewById(R.id.exp_list);
    listView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
        @Override
        public boolean onChildClick(ExpandableListView parent, View v,int groupPosition, int childPosition, long id) {
            if(list.size()>0){
                if(list.get(groupPosition).getSubCategorias().size()>0){
                    SubCategoria subCategoria = list.get(groupPosition).getSubCategorias().get(childPosition);
                    Log.d(General.appname, subCategoria.getNombre());
                }
            }

            return true;
        }
    });

    //This work only the first time
    //DataReader.getInstance(getContext(), this).Categorias_fill();

    //This work everytime
    DataReader dataReader = new DataReader(getContext(), this);
    dataReader.Categorias_fill();

    return view;
}

@Override
public void onBindData(ArrayList<Object> objects) {
    list = (ArrayList) objects;
    adapter = new Categorias_Adapter(getContext(), list);
    listView.setAdapter(adapter);
}

共 (1) 个答案

  1. # 1 楼答案

    在对getInstance()的后续调用中,未设置上下文和数据侦听器。他们仍然会在第一次打电话时指向任何东西

    我建议尝试以下方法:显式设置DataReader。上下文和数据读取器。getInstance()方法中的数据侦听器