0

Ich habe zwei liquefragments. "SolFrameFragment" und "EntryFragment". "SolFrameFragment" hat eine benutzerdefinierte Listenansicht mit 6 Textviews pro Zeile. "GetTitleContents" füllt "MainActivity.titleList", was eine Objekt-Arraylist ist. Meine Listenansicht in "SolFrameFragment" ist immer leer und ich kann nicht herausfinden warum.Benutzerdefinierte Listenansicht in einem Listenfragment mit swipeview

Edit: GetView in SolFrameFragment nicht eingegeben. Was ist das Problem?

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

was in 'GetTitleContents'? – petey

+0

Das füllt MainActivity.titleList. Ich werde das auch hinzufügen danke für das Erinnern. – CrateC

+0

Können Sie herausfinden, ob eine IOException passiert? (Debug-Breakpoint) – petey

Antwort

0

Das Problem ist in der onActivityCreated Rückruf-Methode in dem Fragmente.

Der Aufruf new GetTitleContents().execute(); kehrt sofort zurück, es gibt keine Garantie, dass MainActivity.titleList bis dahin ausgefüllt wurde. Sie legen also im Wesentlichen eine leere Liste für den Adapter fest.

+0

Nein, nein. Ich habe überprüft und es wird ausgefüllt. – CrateC

+0

Es wird ja bevölkert. Aber nicht bevor Sie die Liste auf den Adapter setzen. – Hahn

+0

Wenn die AsyncTask nicht "zu lang" sein soll, versuchen Sie, nach der Ausführung von execute() eine Thread.sleep (4000) einzufügen, bevor Sie die titleList setzen. – Hahn

0

Unter der Annahme, GetTitleContents ist ein AsyncTask (Sie haben es nicht zu Ihrer Frage hinzugefügt), versuchen Sie:

  1. Geben Ihrer Liste Fragment zur Schaffung der GetTitleContents Aufgabe später für

  2. Bewegung verwenden, um die setListAdapter Aufruf der Methode der onPostExecuteGetTitleContents Aufgabe (die spätere Verwendung)

Insgesamt sollte es in etwa wie folgt aussehen:

GetTitleContents Aufgabe

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)); 
     } 
    } 
} 

Aktualisiert onActivityCreated Methode

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

Ich habe versucht, aber es hat nicht funktioniert. Ich denke, wie Hahn sagt, wird zuerst MainActivity.titleList eingestellt und dann ausgefüllt. Aber ich konnte es nicht beheben. – CrateC

+0

@CrateC können Sie Ihre Frage bearbeiten und den Code GetTitleContents hinzufügen – petey

+0

Entschuldigung für die späte Antwort. Ich habe hinzugefügt, dass es der letzte Status ist. Aber ich habe es so geändert, wie du es mir in deinen vorherigen Antworten gesagt hast. – CrateC

Verwandte Themen