我正在创建一个解析URL数据的应用程序,将数据分成不同的类别,然后将数据显示在不同的ListView中。我已经成功解析了数据,但是我在显示信息方面遇到了问题。它有点复杂:我的应用程序有6个片段(使用SwipeViews),每个片段将显示一部分数据(List)。从我扩展到AsyncTask的类ParseManager,我正在做所有的事情(解析,获取列表等)。 MainActivity执行AsyncTask,我想要做的是发送我在AsyncTask中收集的数据并将其发送到不同的Fragments。问题是片段和数据之间的通信,因为片段是在onCreateView()方法中创建的,并且在创建视图后接收数据。这是完成所有工作的课程
public class ParseManager extends AsyncTask<Void,Integer,Void>{
static ArrayList<Item> news=new ArrayList<Item>();
static ArrayList<Item> items=new ArrayList<Item>();
private static String FEED_URL="some url";
public int ready=0;
Message msg;
protected void onProgressUpdate(Integer... progress) {
}
protected void onPostExecute(Void result) {
super.onPostExecute(result);
Log.d("TASK","TASK FINISHED....");
return;
}
@Override
protected Void doInBackground(Void... params){
Log.d("TASK","TASK IS BEING PROCESSED....");
loadXML();
return null;
}
public void loadXML(){
try{
URL url=new URL(FEED_URL);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setReadTimeout(1000);
conn.setConnectTimeout(1500);
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.connect();
InputStream stream=conn.getInputStream();
XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
XmlPullParser xmlParser=factory.newPullParser();
xmlParser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
xmlParser.setInput(stream,null);
items=(ArrayList<Item>) XmlFeedParser.parser(xmlParser);
stream.close();
}catch(Exception e){
e.printStackTrace();
}
}
public static List<Item> getNews(){
if(items==null)
return null;
List<Item> news=new ArrayList<Item>();
for(Item item:items){
if("news_section".equals(item.getType()))
news.add(item);
}
return news;
}// for the rest of the data, there are other methods
`
这是显示数据的片段之一
public class HomeActivity extends Fragment{
static ListView newsList;
static Item item=null;//list of Item objects
static Context context;
static ItemAdapter itemAdapter;
static AllItems articles=new AllItems();
static List<Item> news=new ArrayList<Item>();
static int i=0;
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){
super.onCreateView(inflater, container, savedInstanceState);
//newsList=(ListView)getActivity().findViewById(R.id.news_list);
// itemAdapter=new ItemAdapter(context,typeOfNew,(ArrayList<Item>)news);
// newsList.setAdapter(itemAdapter);
return inflater.inflate(R.layout.home_activity, container,false);
}
public static void displayNews(List<Item> news){
try {
if(news==null || news.size()==0){
//Retrieve again the data list
}
//Log.d("HomeActivity","total news: "+news.size());
for(Item item:news){ //Item is the object that I'm using to create the List
news.get(i);
i++;
itemAdapter.add(news.get(i));
}
} catch (Exception e) {
e.printStackTrace();
}
}
在主Activity中我只用这一行在OnCreateView()中执行AsyncTask parser.execute();
我已经读过我可以使用处理程序,因此数据线程可以与UI线程通信,但我迷路了。我总共有6个片段,我想要显示数据,所有片段都是从MainActivity初始化的。我添加了几个log.d来可视化应用程序的工作方式,所有片段都是在AsynTask完成数据处理。如果您需要更多信息或代码,请帮助,任何信息,请告诉我。提前谢谢。
答案 0 :(得分:0)
在您的主Activity中,为每个片段创建成员变量,即
private FragmentA fragmentA;
private FragmentB fragmentB;
在Fragment类中,为数据定义一个setter:
public void setListItems(List<Item> listItems) {
// Code for updating the Fragment UI components here
}
AsyncTask完成后,从主Activity调用
this.fragmentA.setListItems(dataForA);
this.fragmentB.setListItems(dataForB);
....
您可能需要让AsyncTask报告在onPostExecute
方法中完成主活动。