2017-06-14 3 views
0

AsyncTaskクラスのAPIからデータを取得しようとしていて、データがRecyclerViewに表示されているフラグメントにデータを戻そうとしています。しかし、データは常にヌルであり、フラグメントは常に空です。asynctaskクラスがフラグメントにデータを返さない

私のコードを見てください。

マイAsyncTaskクラス:

public class EmployeesData extends AsyncTask<Void, Void, List<Employee>>{ 

List<Employee> data = new ArrayList<>(); 
EmployeesFragment emp; 

public EmployeesData (EmployeesFragment emp){ 
    this.emp= emp; 
} 


@Override 
protected List<Employee> doInBackground(Void... arg0) { 
    RestService restService = new RestService(); 
    try { 

     restService.getService().getEmployees(new Callback<List<Employee>>() { 

      @Override 
      public void success(List<Employee> employee, Response response) { 

       data = employee; 
      } 

      @Override 
      public void failure(RetrofitError error) { 
       Toast.makeText(emp.getContext(), error.getMessage().toString(), Toast.LENGTH_LONG).show(); 
      } 
     }); 
    } catch (Exception ex) { 
     Toast.makeText(emp.getContext(), ex.getMessage().toString(), Toast.LENGTH_LONG).show(); 

    } 
    return data; 
} 

@Override 
protected void onPostExecute(List<Employee> data) { 
    super.onPostExecute(data); 
    emp.setList(data); 
} 
} 

マイ・フラグメント:

public class EmployeesFragment extends Fragment { 

RecyclerView rv; 
List<Employee> employees= new ArrayList<>(); 
public EmployeesFragment() { 
    // Required empty public constructor 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_employees, container, false); 

    rv = (RecyclerView) view.findViewById(R.id.emp_Rv); 
    rv.setLayoutManager(new LinearLayoutManager(getContext())); 

    fireYourAsyncTask(); 


    EmployeesRvAdapter adapter = new EmployeesRvAdapter (employees, getActivity()); 

    rv.setAdapter(adapter); 

    return view; 
} 

public void setList(List<Employee> data) { 
    employees= data; 
} 

public void fireYourAsyncTask() { 
    new EmployeesData(this).execute(); 
} 
} 

マイRecyclerViewアダプタ:

public class EmployeesRvAdapter extends RecyclerView.Adapter<EmployeesRvAdapter.EmployeesHolder> { 
List<Employees> employees; 
LayoutInflater inflater; 
Context context; 
public class EmployeesHolder extends RecyclerView.ViewHolder { 
    TextView name, description; 
    View container; 
    public EmployeesHolder(View itemView) { 
     super(itemView); 
     name = (TextView) itemView.findViewById(R.id.name_tv); 
     description = (TextView) itemView.findViewById(R.id.description_tv); 
     container = itemView.findViewById(R.id. item_root); 
    } 
} 
public EmployeesRvAdapter(List<Employees> employees, Context c) { 
    this.inflater = LayoutInflater.from(c); 
    this.employees = employees; 
    context = c; 
} 
@Override 
public EmployeesRvAdapter.EmployeesHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    View v = inflater.inflate(R.layout.employees_rv_item, parent, false); 
    return new EmployeesRvAdapter.EmployeesHolder(v); 
} 
@Override 
public void onBindViewHolder(final EmployeesRvAdapter.EmployeesHolder holder, int position) { 
    Employees employee = Employees.get(position); 
    holder.name.setText(employee.getName()); 
    holder.description.setText(employee.getDescription()); 
} 
@Override 
public int getItemCount() { 
    return employees.size(); 
} 
} 

マイRestServiceクラス:

public class RestService { 
private static final String URL = "http://localhost:23000/"; 
private retrofit.RestAdapter restAdapter; 
private EmployeesService apiService; 

public RestService() 
{ 
    restAdapter = new retrofit.RestAdapter.Builder() 
      .setEndpoint(URL) 
      .setLogLevel(retrofit.RestAdapter.LogLevel.FULL) 
      .build(); 

    apiService = restAdapter.create(EmployeesService.class); 
} 

public EmployeesService getService() 
{ 
    return apiService; 
} 
} 

私の従業員サービス・インターフェース:私は間違っているつもりです

public interface EmployeesService { 
    @GET("/api/employees") 
    public void getEmployees(Callback<List<Employee>> callback); 
} 

ことができる人のポイント?私は助けに感謝します。

はあなたにすべての

答えて

1

まずありがとう、あなたはレトロフィットとAsyncTaskを必要としません。

それは単にこの

private EmployeesRvAdapter adapter; 

public void fireYourAsyncTask() { 

    EmployeesService service = new RestService().getService(); 
    try { 

     service.getEmployees(new Callback<List<Employee>>() { 

      @Override 
      public void success(List<Employee> employee, Response response) { 
       employees.clear(); 
       employees.addAll(employee); 
       adapter.notifyDatSetChanged(); 
      } 

      @Override 
      public void failure(RetrofitError error) { 
       Toast.makeText(emp.getContext(), error.getMessage().toString(), Toast.LENGTH_LONG).show(); 
      } 
     }); 

可能性がありますが、これをしなかった場合、それはクリーン探しだが、それはあなた次第

public class EmployeesFragment extends Fragment implements Callback<List<Employee>> { 

そしてクリーナーで、私が意味する、それは単に

public void fireYourAsyncTask() { 
    EmployeesService service = new RestService().getService(); 
    service.getEmployees(this); 
} 
だのです

どこにtを追加しても彼はデータをArrayListに追加する方法ではありません

employees= data; 

これは再割り当てです。これは追加です

employees.clear(); 
employees.addAll(data); 
+0

ありがとうございます。それは完璧に働いた。 APIから取得したこのデータをキャッシュデータとして保存して、オフラインでもアクセスできるようにするにはどうすればよいですか? – vinitpradhan18

+0

短い答え:SQLite、Realmデータベース、またはFirebase。別の質問を投稿しても構いません –

関連する問題