java - 在 ListFragment 中显示自定义 ArrayAdapter

标签 java android meteor

我想在带有 SlidingTabLayout 的 ListFragment 中显示我的自定义 ArrayAdapter。之前我在正常 Activity 中测试了适配器并且工作正常,SlidingTabLayout 也正常工作,但 ListFragment 没有显示任何内容。我从 meteor 服务器获取数据,logcat 显示数据已下载...

有人有什么建议吗?

这是我的 Java fragment 代码:

public class MorningFragment extends ListFragment {

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_morning,container,false);


    return v;
}

@Override
public void onActivityCreated(Bundle savedInstanceState){
    super.onActivityCreated(savedInstanceState);
    MedicationTimeAdapter timeAdapter;
    timeAdapter = new MedicationTimeAdapter(getActivity(), R.layout.item_time);
    setListAdapter(timeAdapter);
}
}

以及我的 fragment XML 代码:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@android:id/list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

    </ListView>

</LinearLayout>

我的适配器

    public class MedicationTimeAdapter extends ArrayAdapter<MedicationTime> implements DataManager.MedicationCallback {
    private static final String LOG_TAG = MedicationTimeAdapter.class.getName();
    private final int resourceId;
    private final Activity activity;
//  private List<MedicationEntry> medications = new ArrayList<MedicationEntry>();

    public MedicationTimeAdapter(Activity context, int resource) {
        super(context, resource);
        resourceId = resource;
        activity = context;
    }

    @Override
    public void handleMedicationPlan(List<MedicationEntry> medication) {
        // ignore
    }

    @Override
    public void handleMedicationTimes(final List<MedicationTime> medicationTimes) {
        // TODO Activity möglicherweise nicht mehr aktiv
        activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                setItems(medicationTimes);
            }
        });
    }


    public void setItems(List<MedicationTime> itemList) {
        clear();
        for (MedicationTime item : itemList) {
            add(item);
        }

        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return super.getCount();
    }

    @Override
    public View getView(int index, View convertView, ViewGroup parent) {
        //data from your adapter
        MedicationTime itemData = getItem(index);

        if (convertView == null) {
//          final LayoutInflater inflater = MHApplication.getLayoutInflater();
            final LayoutInflater inflater = LayoutInflater.from(parent.getContext());
            // TODO mit Referenz Parent-Group erzeugen?! (war für ColorFinder notwendig, um die LayoutParams beim Laden zu erhalten)
//          convertView = inflater.inflate(resourceId, parent, false);
            convertView = inflater.inflate(resourceId, null);
//          prepareInflatedView(convertView);
        }

        setViewContent(index, convertView, itemData);

        return convertView;
    }

    protected void setViewContent(int index, View itemView, MedicationTime itemData) {
        final TextView nameView = (TextView) itemView.findViewById(R.id.time_name);
        final TextView medicationView = (TextView) itemView.findViewById(R.id.medication);

        int nameId = activity.getResources().getIdentifier("time_name." + itemData.getTimeName(), "string", activity.getPackageName());
        nameView.setText(activity.getResources().getString(nameId));
        nameView.setText(nameId);

        StringBuilder medText = new StringBuilder();
        List<MedicationTime.Entry> medications = itemData.getMedications();
        for (MedicationTime.Entry medication : medications) {
            medText.append(medication.getCount());
            medText.append(" * ");
            medText.append(medication.getMedicationEntry().getSubstance());
            medText.append(" (");
            medText.append(medication.getMedicationEntry().getTradingName());
            medText.append(")\n");
        }
        medicationView.setText(medText.toString());
    }

编辑:

我解决了问题,我的 mainActivity 中有一个方法可以用数据填充适配器。问题是我在我的 fragment 中创建了一个新的适配器。因此,我在 Fragment 类中添加了一个 konstruktor,并从 mainActivity 提交了 Adapter。

   public MorningFragment(MedicationTimeAdapter timeAdapter) {
    medicationTimeAdapter = timeAdapter;
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_morning,container,false);

    setListAdapter(medicationTimeAdapter);

    return v;
}

最佳答案

调用handleMedicationTimes(final List<MedicationTime> medicationTimes)对于一些数据,您的代码似乎没有夸大任何数据。

关于java - 在 ListFragment 中显示自定义 ArrayAdapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36473642/

相关文章:

javascript - Mongodb 按另一个数组的顺序排序

java - 使用Codename一解析Json数据并显示在List中

android - 如何刷新 ImageView 的内容

javascript - Meteor 中的重复代码

java - 如何从 vaadin 的 'com.vaadin.DefaultWidgetSet' 错误中恢复

android - Dagger 2 和 Android 数据绑定(bind)冲突

javascript - 在 meteor 中每天安排一个任务

java - 单元测试 : check if a particular Comparable has been called

java - Gradle building rest spring app找不到主类

java - 如何使用递归创建二进制搜索算法