0

我有兩個listfragments。 「SolFrameFragment」和「EntryFragment」。 「SolFrameFragment」有一個自定義列表視圖,每行有6個textview。 「GetTitleContents」填充「MainActivity.titleList」,它是一個對象Arraylist。我在「SolFrameFragment」中的列表視圖始終是空的,我無法弄清楚爲什麼。用swipeview在listfragment中自定義listview

編輯:它不會在SolFrameFragment中輸入GetView。問題是什麼?

SolFrameFragment

public class SolFrameFragment extends ListFragment implements View.OnClickListener { 

private SolFrameAdapter solFrameAdapter; 
ArrayList<TitleClass> titleList; 

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

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.fragment_sol_frame, container, false); 
} 

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    titleList = new ArrayList<>(); 

    new GetTitleContents().execute(); 
    titleList = MainActivity.titleList; 

    solFrameAdapter = new SolFrameAdapter(getActivity(), R.layout.solframe_single, titleList); 
    setListAdapter(solFrameAdapter); 
} 

@Override 
public void onClick(View v) { 

} 
} 

SolFrameAdapter

public class SolFrameAdapter extends ArrayAdapter<TitleClass> { 
private final Context context; 
private final ArrayList<TitleClass> titleClassList; 

public SolFrameAdapter(Context context, int resource, ArrayList<TitleClass> titleClassList) { 
    super(context, resource); 
    this.context = context; 
    this.titleClassList = titleClassList; 
} 

@NonNull 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    TitleHolder holder; 
    LayoutInflater layoutInflater = ((Activity) context).getLayoutInflater(); 

    if (convertView == null) { 
     convertView = layoutInflater.inflate(R.layout.solframe_single, parent, false); 
     holder = new TitleHolder(); 
     holder.titleTV = (TextView) convertView.findViewById(R.id.titleNameTV); 
     holder.linkTV = (TextView) convertView.findViewById(R.id.titleLinkTV); 
     holder.todayEntryTV = (TextView) convertView.findViewById(R.id.titleTodayCountTV); 
     holder.totalEntryTV = (TextView) convertView.findViewById(R.id.titleTotalCountTV); 
     holder.lastWriterTV = (TextView) convertView.findViewById(R.id.titleLastWriterTV); 
     holder.firstWriterTV = (TextView) convertView.findViewById(R.id.titleFirstWriterTV); 
     convertView.setTag(holder); 
    } else { 
     holder = (TitleHolder) convertView.getTag(); 
    } 

    TitleClass titleClass = titleClassList.get(position); 

    holder.titleTV.setText(titleClass.getTitle()); 
    holder.linkTV.setText(titleClass.getLink()); 
    holder.todayEntryTV.setText(titleClass.getTodayEntry()); 
    holder.totalEntryTV.setText(titleClass.getTotalEntry()); 
    holder.firstWriterTV.setText(titleClass.getFirstWriter()); 
    holder.lastWriterTV.setText(titleClass.getLastWriter()); 

    return convertView; 
} 

static class TitleHolder { 
    TextView totalEntryTV; 
    TextView todayEntryTV; 
    TextView titleTV; 
    TextView linkTV; 
    TextView firstWriterTV; 
    TextView lastWriterTV; 

} 
} 

TitleClass

public class TitleClass { 
int totalEntry; 
int todayEntry; 
String title; 
String link; 
String firstWriter; 
String lastWriter; 

public TitleClass(int todayEntry, int totalEntry, String link, String title, String firstWriter, String lastWriter) { 
    this.totalEntry = totalEntry; 
    this.todayEntry = todayEntry; 
    this.title = title; 
    this.link = link; 
    this.firstWriter = firstWriter; 
    this.lastWriter = lastWriter; 
} 

public int getTotalEntry() { 
    return totalEntry; 
} 

public int getTodayEntry() { 
    return todayEntry; 
} 

public String getTitle() { 
    return title; 
} 

public String getLink() { 
    return link; 
} 

public String getFirstWriter() { 
    return firstWriter; 
} 

public String getLastWriter() { 
    return lastWriter; 
} 
} 

個solframe_single.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:padding="5dp"> 

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <TextView 
     android:id="@+id/titleNameTV" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true" 
     android:text="Başlık İsmi" 
     android:textSize="20sp" /> 

    <TextView 
     android:id="@+id/titleTodayCountTV" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentRight="true" 
     android:layout_centerVertical="true" 
     android:text="bugün" 
     android:textSize="20sp" /> 

    <TextView 
     android:id="@+id/titleLinkTV" 
     android:layout_width="0dp" 
     android:layout_height="0dp" /> 

    <TextView 
     android:id="@+id/titleFirstWriterTV" 
     android:layout_width="0dp" 
     android:layout_height="0dp" /> 

    <TextView 
     android:id="@+id/titleLastWriterTV" 
     android:layout_width="0dp" 
     android:layout_height="0dp" /> 

    <TextView 
     android:id="@+id/titleTotalCountTV" 
     android:layout_width="0dp" 
     android:layout_height="0dp" /> 
</RelativeLayout> 

</RelativeLayout> 

GetTitleContents

public class GetTitleContents extends AsyncTask<String, Void, ArrayList<TitleClass>> { 

SolFrameFragment listFragment; 
ArrayList<TitleClass> titleArrayList = new ArrayList<>(); 
private String url = "website_url"; 
private int pageNo = 1; 

public GetTitleContents(SolFrameFragment listFragment) { 
    super(); 
    this.listFragment = listFragment; 
} 

@Override 
protected ArrayList<TitleClass> doInBackground(String... params) { 
    try { 
     if (!titleArrayList.isEmpty()) 
      titleArrayList.clear(); 

      //Some works for fetching data 

      titleArrayList.add(new TitleClass(todayEntry, totalEntry,  titleLink, titleName, firstAuthor[1], lastAuthor[1])); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return titleArrayList; 
} 

@Override 
protected void onPostExecute(ArrayList<TitleClass> titleArrayList) { 
    super.onPostExecute(titleArrayList); 
    if (listFragment != null) { 
     listFragment.setListAdapter(new SolFrameAdapter(listFragment.getActivity(), R.layout.solframe_single, titleArrayList)); 
    } 
} 

public int getTodayEntry(String text) { 
    String result = null; 
    Pattern p = Pattern.compile("[0-9]+$"); 
    Matcher m = p.matcher(text); 
    if (m.find()) { 
     result = m.group(); 
    } 
    if (result != null) 
     return Integer.parseInt(result); 
    else 
     return 0; 
} 
} 
+0

什麼在'GetTitleContents'? – petey

+0

填充MainActivity.titleList。我會補充一點,謝謝提醒。 – CrateC

+0

你能找出是否有IOException發生? (調試斷點) – petey

回答

0

的問題是在片段的onActivityCreated回調方法。

調用new GetTitleContents().execute();立即返回,不能保證MainActivity.titleList已被填充。所以你基本上爲適配器設置一個空列表。

+0

不,不。我查了一下,它正在填充。 – CrateC

+0

它被填充是的。但是在將列表設置到適配器之前不能。 – Hahn

+0

如果AsyncTask不應占用「太長時間」,請嘗試在execute()之後放置Thread.sleep(4000),然後設置titleList。 – Hahn

0

假設GetTitleContents是一種的AsyncTask(你還沒有把它添加到你的問題),請嘗試:

  1. 通過你的列表片段創建GetTitleContents任務供以後使用

  2. setListAdapter調用GetTitleContents任務的onPostExecute方法(以後使用)

總之它看起來應該像下面這樣:

GetTitleContents任務

public class GetTitleContents extends AsyncTask<Void, Void, ArrayList<TitleClass>> { 

    ListFragment listFragment; 
    public GetTitleContents(ListFragment listFragment) { 
     super(); 
     this.listFragment = listFragment; 
    } 

    @Override 
    protected ArrayList<TitleClass> doInBackground(Void... voids) { 
     // whatever you have currently that fetches and creates the arraylist 

    } 

    @Override 
    protected void onPostExecute(ArrayList<TitleClass> titleList) { 
     super.onPostExecute(titleList); 
     // whatever code you have that sets it in MainActivity (probably no longer needed) 

     if (listFragment != null) { 
      listFragment.setListAdapter(new SolFrameAdapter(listFragment.getActivity(), R.layout.solframe_single, titleList)); 
     } 
    } 
} 

更新onActivityCreated方法

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    new GetTitleContents(this).execute(); 
} 
+0

我試過了,但沒有奏效。我想哈恩說,首先MainActivity.titleList正在設置,然後填充。但我無法修復它。 – CrateC

+0

@CrateC你可以請編輯你的問題,並添加GetTitleContents代碼 – petey

+0

對不起,延遲迴復。我添加了它的最後狀態。但是我改變了它,正如你在之前的回覆中告訴我的那樣。 – CrateC