1

私の問題はAsyncTaskでデータを生成できるが、データをonCreateViewに戻すことができないことです。これは断片への私の最初の潜水です。申し訳ありませんが、私のコードが醜い場合は、これを動作させようとしているだけでなく、Androidのプログラミングには全く新しいので、もし私がどこかでばかげたミスを犯したら、すみません。グローバル変数を投稿する必要があるかどうかはわかりません。私の変数のいくつかは変な名前であることが分かっています。AsynctaskのデータはRecyclerViewのonCreateViewに継承されません

onCreateView部分

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_news, 
      container, false); 
    pb = (ProgressBar) getActivity().findViewById(R.id.progressBar2); 
    gv = (RecyclerView) view.findViewById(R.id.expandableListView); 
    swp = (SwipeRefreshLayout) getActivity().findViewById(R.id.activity_main_swipe_refresh_layout); 

    gv.setHasFixedSize(true); 
    LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); 
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    gv.setLayoutManager(layoutManager); 

    swp.setEnabled(false); 

    hadapter = new NewsExpandableAdapter(getActivity(), m_hparts); 

    System.out.println(m_hparts.size()); 
    gv.setAdapter(hadapter); 
    return view; 
} 

RecyclerViewアダプタ

public class NewsExpandableAdapter extends RecyclerView.Adapter<NewsExpandableAdapter.ViewHolder> { 

    private Context context; 

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     public TextView nameTextView; 
     public ImageView messageButton; 

     public ViewHolder(View itemView) { 
      super(itemView); 

      nameTextView = (TextView) itemView.findViewById(R.id.title); 
      messageButton = (ImageView) itemView.findViewById(R.id.image); 
     } 
    } 

    private ArrayList<Model> mContacts; 

    public NewsExpandableAdapter(Context c, ArrayList<Model> contacts) { 

     this.context = c; 
     mContacts = (ArrayList<Model>) contacts; 
    } 

    @Override 
    public NewsExpandableAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     Context context = parent.getContext(); 
     LayoutInflater inflater = LayoutInflater.from(context); 

     View contactView = inflater.inflate(R.layout.expandable_list_item, parent, false); 

     ViewHolder viewHolder = new ViewHolder(contactView); 
     return viewHolder; 
    } 

    @Override 
    public void onBindViewHolder(NewsExpandableAdapter.ViewHolder viewHolder, int position) { 
     Model contact = mContacts.get(position); 

     TextView textView = viewHolder.nameTextView; 
     textView.setText(contact.getTitle()); 

     ImageView image= viewHolder.messageButton; 

     Picasso.with(viewHolder.itemView.getContext()) 
       .load(contact.getLink()) 
       .into(image); 


    } 

    @Override 
    public int getItemCount() { 
     return mContacts.size(); 
    } 
} 

フラグメントXML

<RelativeLayout 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" 
    tools:context="com.example.sample"> 

    <android.support.v7.widget.RecyclerView 
     android:layout_width="match_parent" 
     android:layout_height="100dp" 
     android:id="@+id/expandableListView"> 
    </android.support.v7.widget.RecyclerView> 

</RelativeLayout> 

RecyclerViewのXML

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


    <ImageView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/image"/> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/title"/> 

</LinearLayout> 

AsyncTask

public class Directory extends AsyncTask<Void, Void, String> { 
     String desc; 

     @Override 
     protected String doInBackground(Void... params) { 

      try { 
       Document document = Jsoup.connect(url + dateFormatYear.format(date)).get(); 

       listing_latest = document.select(".title.page_title"); 

       for (Element listing0 : listing_latest) { 

        Element hmonth = listing0.select("h3").first(); 
        if(hmonth.text().equals(dateFormatMonth.format(date))){ 
         month = hmonth.text(); 
         hname = hmonth.parent().parent().parent().nextElementSibling(); 
         releaseList = hname.select(".base_header.tc.m6"); 
         for(Element block : releaseList){ 
          name = block.select(".one_line.fs11 a").first(); 
          image = block.select(".base_inner.h244.loading a img").first(); 
          if(name != null){ 
           hn = name.attr("title"); 
          } 
          if(image != null){ 
           hi = image.attr("abs:src"); 
          } 
          m_hparts.add(new Model(hi)); 
         } 
        } 
       } 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
      hadapter.notifyDataSetChanged(); 
      m_hparts.add(new Model(hi)); 
     } 
    } 

編集:私はまだonCreate()new Directory().execute();を入れてデータを取得できませんでした。

+0

、と私は 'onPostExecute' – Asker

+0

に編集を追加しました:あなたはこのような何かを行うことができ

List<Model> m_hparts = new ArrayList<>(); 

アクティビティのフラグメント内のオブジェクト: "pb"と "swp"。フラグメントは、他のアクティビティで再利用できます。必要な場合は、それらのオブジェクトが必要な場所でgetActivity()を呼び出します。場合によっては、getActivityがnullを返すことがあることに注意してください(フラグメントがアクティビティから分離されている場合)。または、onAttach(アクティビティアクティビティ)でpbとswpに書き込み、onDetach()でnullに設定することもできます。 – babay

答えて

3

データソースにすべての新しいアイテムを追加し、データソースの更新後にnotifyDataSetChanged()を呼び出す必要があります。

doInBackground()の返品値をあなたの商品のリストにして、onPostExecute()に戻してください。 AsyncTaskジェネリックのパラメータと、onPostExecute()に渡されるパラメータを変更する必要があります。

データソースは次のようになりますと仮定:保管しないで、私の編集を参照してください

public class Directory extends AsyncTask<Void, Void, List<Model>> { 
    String desc; 

    @Override 
    protected List<Model> doInBackground(Void... params) { 
     //added: 
     List<Model> parts = new ArrayList<>(); 

     try { 
      Document document = Jsoup.connect(url + dateFormatYear.format(date)).get(); 

      listing_latest = document.select(".title.page_title"); 

      for (Element listing0 : listing_latest) { 

       Element hmonth = listing0.select("h3").first(); 
       if(hmonth.text().equals(dateFormatMonth.format(date))){ 
        month = hmonth.text(); 
        hname = hmonth.parent().parent().parent().nextElementSibling(); 
        releaseList = hname.select(".base_header.tc.m6"); 
        for(Element block : releaseList){ 
         name = block.select(".one_line.fs11 a").first(); 
         image = block.select(".base_inner.h244.loading a img").first(); 
         if(name != null){ 
          hn = name.attr("title"); 
         } 
         if(image != null){ 
          hi = image.attr("abs:src"); 
         } 
         //m_hparts.add(new Model(hi)); 
         //do this instead: 
         parts.add(new Model(hi)); 
        } 
       } 
      } 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
     //return null; 
     //do this instead: 
     return parts; 
    } 

    @Override 
    protected void onPostExecute(List<Model> parts) { 
     super.onPostExecute(result); 
     for (Model h: parts) { 
      m_hparts.add(h); 
     } 

     hadapter.notifyDataSetChanged(); 
    } 
} 
関連する問題