我的 DataReader 实例有问题 Class
Problems with intance of my DataReader Class
我的自定义 class 获取数据时遇到了一些问题。我创建了一个自定义 class 用于从我的 Web 服务获取数据,当我尝试使用我的单例 class 时出现问题,如果我使用 DataReader.getInstance(getContext(), this)
我的列表视图仅填充第一个应用程序启动的时间。但是如果我使用我的 DataReader 的新实例随时都可以正常工作..
这是我的 DataReader Class:
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);
}
在随后对 getInstance()
的调用中,您的上下文和 Data_Listener 没有设置。他们仍然会指向他们在第一次调用时指向的任何内容。
我建议尝试这样做:在您的 getInstance() 方法中显式设置 DataReader.context 和 DataReader.data_listener。
我的自定义 class 获取数据时遇到了一些问题。我创建了一个自定义 class 用于从我的 Web 服务获取数据,当我尝试使用我的单例 class 时出现问题,如果我使用 DataReader.getInstance(getContext(), this)
我的列表视图仅填充第一个应用程序启动的时间。但是如果我使用我的 DataReader 的新实例随时都可以正常工作..
这是我的 DataReader Class:
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);
}
在随后对 getInstance()
的调用中,您的上下文和 Data_Listener 没有设置。他们仍然会指向他们在第一次调用时指向的任何内容。
我建议尝试这样做:在您的 getInstance() 方法中显式设置 DataReader.context 和 DataReader.data_listener。