2016-08-25 4 views
0

Итак, у меня есть Fragment, который должен получать некоторые данные из Интернета с помощью RecyclerView. Я хочу добавить жестов для обновления Swipe к моему фрагменту, чтобы пользователь мог проверить, есть ли какая-либо новая часть данных. Вот мой код:SwipeRefreshLyout не работает должным образом

Фрагмент:

public class HomeFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener{ 


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

RecyclerView recyclerView; 
SwipeRefreshLayout swipeRefreshLayout; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 

    View view = inflater.inflate(R.layout.fragment_home, container, false); 

    swipeRefreshLayout=(SwipeRefreshLayout) view.findViewById(R.id.swipeRefreshLayout); 
    recyclerView = (RecyclerView) view.findViewById(R.id.recylerview); 

    ReadRss readRss = new ReadRss(getContext(), recyclerView); 
    readRss.execute(); 


    return view; 
} 


@Override 
public void onRefresh() { 

    new ReadRss(getContext(), recyclerView).execute(); 
    if(swipeRefreshLayout.isRefreshing())swipeRefreshLayout.setRefreshing(false); 

} 
} 

XML Layout:

<android.support.v4.widget.SwipeRefreshLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:app="https://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/swipeRefreshLayout" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    tools:context="com.example.essat.essat.HomeFragment" 
    > 


    <!-- TODO: Update blank fragment layout --> 
    <android.support.v7.widget.RecyclerView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/recylerview" 
     /> 

> 
</android.support.v4.widget.SwipeRefreshLayout> 

Проблема в том, что SwipeRefreshLayout никогда не перестанет вращаться, даже этот кусок кода:

if(swipeRefreshLayout.isRefreshing())swipeRefreshLayout.setRefreshing(false); 

Надеюсь, кто-то знает, как это исправить, спасибо!

UPDATE:

public class ReadRss extends AsyncTask<Void, Void, Void> { 
Context context; 
String address = "http://www.sciencemag.org/rss/news_current.xml"; 
ProgressDialog progressDialog; 
URL url; 
ArrayList<FeedItem>feedItems; 
RecyclerView recyclerView; 


public ReadRss(Context context,RecyclerView recyclerView ) { 
    this.recyclerView=recyclerView; 
    this.context = context; 

    progressDialog = new ProgressDialog(context); 
    progressDialog.setMessage("Loading..."); 
} 

@Override 
protected void onPreExecute() { 
    progressDialog.show(); 
    super.onPreExecute(); 
} 

@Override 
protected void onPostExecute(Void aVoid) { 
    super.onPostExecute(aVoid); 
    progressDialog.dismiss(); 
    ((IWithHttpRequest) context).onDataUpdate(); 
    Adapter adapter = new Adapter(context, feedItems); 
    recyclerView.setLayoutManager(new LinearLayoutManager(context)); 
    recyclerView.addItemDecoration(new VerticalSpace(20)); 
    recyclerView.setAdapter(adapter); 

} 

@Override 
protected Void doInBackground(Void... params) { 
    ProcessXml(Getdata()); 
    return null; 
} 

private void ProcessXml(Document data) { 
    if (data != null) { 
     feedItems=new ArrayList<>(); 
     Element root = data.getDocumentElement(); 
     Node channel = root.getChildNodes().item(1); 
     NodeList items = channel.getChildNodes(); 
     for (int i = 0; i < items.getLength(); i++) { 
      Node cureentchild = items.item(i); 
      if (cureentchild.getNodeName().equalsIgnoreCase("item")) { 
       FeedItem item=new FeedItem(); 
       NodeList itemchilds = cureentchild.getChildNodes(); 
       for (int j = 0; j < itemchilds.getLength(); j++) { 
        Node cureent = itemchilds.item(j); 
        if (cureent.getNodeName().equalsIgnoreCase("title")){ 
         item.setTitle(cureent.getTextContent()); 
        }else if (cureent.getNodeName().equalsIgnoreCase("description")){ 
         item.setDescription(cureent.getTextContent()); 
        }else if (cureent.getNodeName().equalsIgnoreCase("pubDate")){ 
         item.setPubDate(cureent.getTextContent()); 
        }else if (cureent.getNodeName().equalsIgnoreCase("link")){ 
         item.setLink(cureent.getTextContent()); 
        }else if (cureent.getNodeName().equalsIgnoreCase("media:thumbnail")) { 
         String url = cureent.getAttributes().item(0).getTextContent(); 
         item.setThumbnailUrl(url); 
        } 
       } 
       feedItems.add(item); 
      } 
     } 
    } 
} 

public Document Getdata() { 
    try { 
     url = new URL(address); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setRequestMethod("GET"); 
     InputStream inputStream = connection.getInputStream(); 
     DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = builderFactory.newDocumentBuilder(); 
     Document xmlDoc = builder.parse(inputStream); 
     return xmlDoc; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 
} 

Фрагмент Обновлено:

public class HomeFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener,IWithHttpRequest{ 


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

RecyclerView recyclerView; 
SwipeRefreshLayout swipeRefreshLayout; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 

    View view = inflater.inflate(R.layout.fragment_home, container, false); 

    swipeRefreshLayout=(SwipeRefreshLayout) view.findViewById(R.id.swipeRefreshLayout); 
    swipeRefreshLayout.setOnRefreshListener(this); 
    recyclerView = (RecyclerView) view.findViewById(R.id.recylerview); 

    ReadRss readRss = new ReadRss(getContext(), recyclerView); 
    readRss.execute(); 


    return view; 
} 



@Override 
public void onRefresh() { 

    new ReadRss(getContext(), recyclerView).execute(); 


} 


@Override 
public void onDataUpdate() { 
    swipeRefreshLayout.setRefreshing(false); 
} 
} 
+0

swipeRefreshLayout.setOnRefreshListener (this); и в onPostExecute вызов swipeRefreshLayout.setRefreshing (false); – Rahul

ответ

1

Вы забыли это в onCreateView

swipeRefreshLayout.setOnRefreshListener(this); 

Кроме того, new ReadRss(getContext(), recyclerView).execute(); является асинхронным, или, по крайней мере, должно быть (не блокируют поток пользовательского интерфейса), так что это будет выглядеть обновление мгновенно. Лучшее решение здесь должно быть создание интерфейса

public interface IWithHttpRequest { 
    void onDataUpdate() 
} 

Сделайте свою деятельность осуществлять IWithHttpRequest

public class HomeFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener, IWithHttpRequest { 
    ... 
    @Override 
    public void onDataUpdate() { 
     swipeRefreshLayout.setRefreshing(false); 
    } 
} 

и в ReadRss, когда вы закончили выборку вызова

((IWithHttpRequest) context).onDataUpdate() 
+0

Интерфейс должен быть частью класса фрагментов? и где я должен его реализовать? в моей деятельности (которая обеспечивает функциональность запуска для моих разных фрагментов) или в моем классе ReadRss (что обеспечивает функциональность выборки данных)? –

+0

Я обновил свой ответ. Интерфейс должен быть объявлен в отдельном файле (IWithHttpRequest.java) –

+0

ReadRss расширяет AsyncTask, и я преодолел 3 метода (onPreExecute, doInBackground, onPostExecute). Я пытался пропустить последнюю строку, которую вы дали мне как в onPostExecute, так и doInBackground, и это не сработало! PS: я использую progressDialog, когда фрагмент запускается на первом месте для извлечения данных! –

0

Вам нужно установить setOnRefreshListener для swipeRefreshLayout.

swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipeRefreshLayout); 
swipeRefreshLayout.setOnRefreshListener(this); 
+0

не работает, у меня все еще такая же проблема! –

1

данных для того, чтобы обновите, вы должны сделать это:

mSwipeRefreshLayout = (SwipeRefreshLayout) myFragmentView.findViewById(R.id.refreshContainer); 
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
     @Override 
     public void onRefresh() { 
     // refresh logic 
     if (mSwipeRefreshLayout.isRefreshing()) { 
       mSwipeRefreshLayout.setRefreshing(false); 
     } 
} 

Вы также можете попробовать очистить свои данные в recyclerview следующим образом: YourAdapter.clearData();