Ich versuche, eine ExpandableListView mit 4 Filter (Gruppenliste) zu implementieren:ExpandableListView in Fragment nicht nach AsyncTask Aktualisierung
Diese erweiterbare Liste ist es auf einem Fragment, weil ich den Meister verwenden möchten/Detail Strömungsmuster.
Wenn ein Benutzer auf einen Filter klickt, wird ein Webdienst von einer AsyncTask aufgerufen, um verknüpfte Elemente des angeklickten Filters zu erhalten. Dann in onPostExecute()
Methode, aktualisiere ich die HashMap dieser erweiterbare Liste, und dann führe ich die notifySetDataChanged
Methode, aber keine Daten erscheinen auf der Liste :(
Hier sind einige Details Code:
TreatmentExpandableListAdapter. java
public class TreatmentExpandableListAdapter extends BaseExpandableListAdapter {
private Context context;
private List<TreatmentState> treatmentStates;
private HashMap<TreatmentState, List<TreatmentSummary>> treatmentsByState;
private TreatmentExpandableListAdapter adapter;
...
@Override
public View getGroupView(int groupPosition, boolean b, View view, ViewGroup viewGroup) {
currentState = treatmentStates.get(groupPosition);
if (view == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.group_item,
null);
}
TextView item = (TextView) view.findViewById(R.id.treatment_state);
item.setTypeface(null, Typeface.BOLD);
item.setText(currentState.toString());
return view;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean b, View view, ViewGroup viewGroup) {
final TreatmentState state = treatmentStates.get(groupPosition);
final TreatmentSummary treatment = (TreatmentSummary) getChild(groupPosition, childPosition);
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (view == null) {
view = inflater.inflate(R.layout.fragment_treatment, null);
}
ImageView mStateView = (ImageView) view.findViewById(R.id.state);
TextView mMedicineView = (TextView) view.findViewById(R.id.medicineName);
TextView mInitDateView = (TextView) view.findViewById(R.id.initDate);
TextView mEndDateView = (TextView) view.findViewById(R.id.endDate);
mStateView.setImageResource(getImageByState(state));
mMedicineView.setText(treatment.getMedicineName());
mInitDateView.setText(treatment.getInitDate());
mEndDateView.setText(treatment.getEndDate());
return view;
}
...
TreatmentListFragment.java
public class TreatmentListFragment extends Fragment {
/* Parameter arguments, fragment initialization parameters */
private static final String PATIENT_ID = "patiendId";
/* Parameters */
private int mColumnCount = 1;
private long patientId;
ExpandableListView expListView;
TreatmentExpandableListAdapter expListAdapter;
List<TreatmentState> states;
/**
* Mandatory empty constructor for the fragment manager to instantiate the
* fragment (e.g. upon screen orientation changes).
*/
public TreatmentListFragment() {
}
@SuppressWarnings("unused")
public static TreatmentListFragment newInstance(long patientId) {
TreatmentListFragment fragment = new TreatmentListFragment();
Bundle args = new Bundle();
args.putLong(PATIENT_ID, patientId);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
patientId = getArguments().getLong(PATIENT_ID);
}
states = Arrays.asList(TreatmentState.values());
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_treatment_list, container, false);
expListView = (ExpandableListView) view.findViewById(R.id.treatment_list);
expListAdapter = new TreatmentExpandableListAdapter(
view.getContext(), states, DiaryAppHelper.getTreatmentsByState());
expListView.setAdapter(expListAdapter);
expListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView expandableListView, View view, int groupPosition, long id) {
TextView tv = (TextView) view.findViewById(R.id.treatment_state);
TreatmentState state = TreatmentState.getEnumByNameState(tv.getText().toString());
new GetTreatmentsTask().execute(state.name());
return true;
}
});
return view;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnListFragmentInteractionListener) {
mListener = (OnListFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnListFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
/**
* This interface must be implemented by activities that contain this
* fragment to allow an interaction in this fragment to be communicated
* to the activity and potentially other fragments contained in that
* activity.
* <p/>
* See the Android Training lesson <a href=
* "http://developer.android.com/training/basics/fragments/communicating.html"
* >Communicating with Other Fragments</a> for more information.
*/
public interface OnListFragmentInteractionListener {
// TODO: Update argument type and name
void onListFragmentInteraction(TreatmentSummary treatment);
}
...
}
GetTreatmentsTask
private class GetTreatmentsTask extends AsyncTask<String, Void, TreatmentSummary[]> {
@Override
protected TreatmentSummary[] doInBackground(String... params) {
try {
final String uri = getContext().getString(R.string.baseURL) + "/treatments_state?patientId=" + DiaryAppHelper.getCurrentUser().getUserAccountId() + "&state=" + params[0];
RestTemplate rt = new RestTemplate();
rt.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
ResponseEntity<TreatmentSummary[]> response = rt.getForEntity(uri, TreatmentSummary[].class);
TreatmentSummary[] treatmentSummaries = response.getBody();
return treatmentSummaries;
} catch (Exception e) {
Log.e("TreatmentExpandableList", e.getMessage(), e);
}
return null;
}
@Override
protected void onPostExecute(TreatmentSummary[] treatmentSummariesArr) {
if (treatmentSummariesArr != null && treatmentSummariesArr.length > 0) {
TreatmentState state = treatmentSummariesArr[0].getState();
Collections.addAll(expListAdapter.getTreatmentsByState().get(state), treatmentSummariesArr);
getActivity().runOnUiThread(new Runnable() {
public void run() {
expListAdapter.notifyDataSetChanged();
}
});
}
}
}
Was mache ich falsch? Jede Hilfe wäre willkommen!