我的自定义适配器不会显示在片段中

时间:2017-10-05 13:57:25

标签: java android listview android-fragments android-arrayadapter

我尝试将一系列日期及其详细信息放在片段中的列表视图中。但是,当我运行应用程序时,根本没有列表视图,只显示文本视图区域。文本视图用于测试,详细信息是正确的。

我认为这个

有些问题
> MyAdapter myAdapter=new MyAdapter(fragTable.this.getActivity(),R.layout.list_view_item,listofDates);
        lv.setAdapter(myAdapter);

//To get dates between 2 Dates (dates)
        while (cal.getTime().before(stringToDaTe(mdateTo))) {
            cal.add(Calendar.DATE, 1);
            dates.add(datetoString(cal.getTime()));
        }

fragTable.java

/**
 * A simple {@link Fragment} subclass.
 * Use the {@link fragTable#newInstance} factory method to
 * create an instance of this fragment.
 */
public class fragTable extends Fragment {
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_LOCNAME = "param1";
    private static final String ARG_LATI = "param2";
    private static final String ARG_LONGI = "param3";
    private static final String ARG_TIMEZONE = "param4";
    private static final String ARG_DATEFROM = "param5";
    private static final String ARG_DATETO = "param6";

    // TODO: Rename and change types of parameters
    private String mlocName;
    private Double mLati;
    private Double mLongi;
    private String mtimeZone;

    private String mdateFrom;
    private String mdateTo;


    ListView lv;
    ArrayList<RSDate> listofDates = new ArrayList<>();

    public fragTable() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment fragTable.
     */
    // TODO: Rename and change types and number of parameters
    public static fragTable newInstance(String locName, double lati, double longi, String timeZone, String datefrom, String dateto) {
        fragTable fragment = new fragTable();
        Bundle args = new Bundle();
        args.putString(ARG_LOCNAME, locName);
        args.putDouble(ARG_LATI,lati);
        args.putDouble(ARG_LONGI,longi);
        args.putString(ARG_TIMEZONE, timeZone);
        args.putString(ARG_DATEFROM,datefrom);
        args.putString(ARG_DATETO,dateto);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mlocName = getArguments().getString(ARG_LOCNAME);
            mLati = getArguments().getDouble(ARG_LATI);
            mLongi = getArguments().getDouble(ARG_LONGI);
            mtimeZone = getArguments().getString(ARG_TIMEZONE);
            mdateFrom = getArguments().getString(ARG_DATEFROM);
            mdateTo = getArguments().getString(ARG_DATETO);
        }
    }

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


        return view;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        TextView tv = view.findViewById(R.id.test);



        Integer daysBetween = getDays(mdateFrom,mdateTo);
        TimeZone tz = TimeZone.getTimeZone(mtimeZone);
        GeoLocation geolocation = new GeoLocation(mlocName, mLati, mLongi, tz);
        AstronomicalCalendar ac = new AstronomicalCalendar(geolocation);

        tv.setText(mlocName+" "+mLati+" "+mLongi+" "+mtimeZone+" "+ mdateFrom+"  to   " + mdateTo +"  =  " +daysBetween
                +"------------"+getSunRiseTime(ac,stringToDaTe(mdateFrom))+"------------"+getSunSetTime(ac,stringToDaTe(mdateFrom)));

        //Table
        List<String> dates = new ArrayList<String>();
        Calendar cal = Calendar.getInstance();
        cal.setTime(stringToDaTe(mdateFrom));
        //To get dates between 2 Dates (dates)
        while (cal.getTime().before(stringToDaTe(mdateTo))) {
            cal.add(Calendar.DATE, 1);
            dates.add(datetoString(cal.getTime()));
        }
        // add to listofDates(RSDate) - dates+ details
        for(String date: dates)
        {
            String clone1= getSunRiseTime(ac,stringToDaTe(date));
            String clone2= getSunSetTime(ac,stringToDaTe(date));
            listofDates.add(new RSDate(date,clone1,clone2));
        }



        lv = view.findViewById(R.id.listOfDate);


        MyAdapter myAdapter=new MyAdapter(fragTable.this.getActivity(),R.layout.list_view_item,listofDates);
        lv.setAdapter(myAdapter);


    }






    public String getSunRiseTime(AstronomicalCalendar ac, Date date)
    {
        String result="";
        Calendar cal = Calendar.getInstance();
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH);
        int day = cal.get(Calendar.DAY_OF_MONTH);

        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
        ac.getCalendar().set(year, month, day);

        result = sdf.format(ac.getSunrise());
        return result;
    }
    public String getSunSetTime(AstronomicalCalendar ac,Date date)
    {
        String result="";
        Calendar cal = Calendar.getInstance();
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH);
        int day = cal.get(Calendar.DAY_OF_MONTH);

        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
        ac.getCalendar().set(year, month, day);

        result = sdf.format(ac.getSunset());
        return result;
    }

    /**Change from string to date*/
    public Date stringToDaTe(String dateString)
    {
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
        Date date = new Date();
        try {
            date = sdf.parse(dateString);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
    public String datetoString(Date date)
    {
        SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");
        Date today = Calendar.getInstance().getTime();
        String result = df.format(today);
        return result;
    }
    /**Calculate Days between two days using Joda Library*/
    public int getDays(String dateFrom, String dateTo)
    {
        int result;

        java.util.Date date1 = stringToDaTe(dateFrom);
        DateTime dateTime1 = new DateTime(date1);

        java.util.Date date2 = stringToDaTe(dateTo);
        DateTime dateTime2 = new DateTime(date2);

        result = Days.daysBetween(dateTime1, dateTime2).getDays();
        return result;
    }   
}

MyAdapter.java

public class MyAdapter extends ArrayAdapter<RSDate> {

ArrayList<RSDate> dateList = new ArrayList<>();

public MyAdapter(Context context, int textViewResourceId, ArrayList<RSDate> objects) {
    super(context, textViewResourceId, objects);
    dateList = objects;
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View v = convertView;
    LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    v = inflater.inflate(R.layout.list_view_item, null);
    TextView dateView = (TextView) v.findViewById(R.id.listView_Date);
    TextView srtView = (TextView) v.findViewById(R.id.listView_sunrise);
    TextView sstView = (TextView) v.findViewById(R.id.listView_sunset);
    dateView.setText(dateList.get(position).getDates());
    srtView.setText(dateList.get(position).getSunRiseTime());
    sstView.setText(dateList.get(position).getSunSetTime());

    return v;

}

}

fragment_frag_table.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.davenguyen.a08suncalculator.fragChooseRange">

<!-- TODO: Update blank fragment layout -->
<TextView
    android:id="@+id/test"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="@string/hello_blank_fragment" />
<ListView
    android:id="@+id/listOfDate"
    android:background="@color/colorAccent"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:divider="@color/colorAccent"
    android:dividerHeight="2dp"></ListView>

1 个答案:

答案 0 :(得分:2)

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

这将是0,您想要使用自己数据的计数:

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

另外,尝试替换

v = inflater.inflate(R.layout.list_view_item, null);

v = inflater.inflate(R.layout.list_view_item, parent, false);

另外:检查ListViewFragment是否正确显示,以缩小适配器或布局上的问题范围。