2014-01-26 49 views
0

我想创建一个模拟Gmail应用程序想法的应用程序(一个导航抽屉选择收件箱或草稿和listfragment等类别以显示列表中的图像)。从asyntask填充listfragment

现在我做了以下内容:

一个MainActivity.java:

public class MainActivity extends ActionBarActivity { 

private DrawerLayout mDrawerLayout; 
private ListView mDrawerList; 
private ActionBarDrawerToggle mDrawerToggle; 
private CharSequence mDrawerTitle; 
private CharSequence mTitle; 
private String[] sections_array; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

     ........................ 
     ............................. 
      ........a bunch of code............... 
............................. 
private class DrawerItemClickListener implements ListView.OnItemClickListener { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      selectItem(position); 
     } 
    } 

    private void selectItem(int position) { 
     // update the main content by replacing fragments 
     Fragment fragment = null; 
     ListFragment lfragment = null; 
     switch (position) { 
     case 0: 
      lfragment = new NewsFragment(); 
      break; 
     case 1: 
      fragment = new TvFragment(); 
    ............................... 
    ............................. 
    .................a bunch of code.............. 
    ............................. 
    public static class NewsFragment extends ListFragment { 

     private ListView listView; 
     private NewsAdapter newsAdapter; 
     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceStatee){ 
      View rootView = inflater.inflate(R.layout.fragment_news, container, false); 
      listView = (ListView) rootView.findViewById(android.R.id.list); 
      return rootView; 
     } 

     @Override 
      public void onActivityCreated(Bundle savedInstanceState) { 
      super.onActivityCreated(savedInstanceState); 

      // URL to the JSON data   
      String strUrl =  "http://wptrafficanalyzer.in/p/demo1/first.php/countries"; 
     // Creating a new non-ui thread task to download json data 
      GetJSON downloadTask = new GetJSON(); 

      // Starting the download process 
      downloadTask.execute(strUrl);  

      } 

    } 

的getJSON:

  /** AsyncTask to download json data */ 
     public class GetJSON extends AsyncTask<String, Integer, String>{ 
    String data = null; 
    private ListView listView; 
private NewsAdapter newsAdapter; 

     @Override 
     protected String doInBackground(String... url) { 
       try{ 
        data = downloadUrl(url[0]); 

       }catch(Exception e){ 
        Log.d("Background Task",e.toString()); 
       } 
       return data; 
     } 

     @Override 
     protected void onPostExecute(String result) { 

      try { 
       JSONObject jObject; 
       jObject = new JSONObject(result); 
       JSONArray jCountries = jObject.getJSONArray("countries"); 
       ArrayList<String> stringArrayList = new ArrayList<String>(); 
       for (int i=0; i < jCountries.length(); i++) 
       { 
        try { 
         JSONObject oneObject = jCountries.getJSONObject(i); 
         // Pulling items from the array 
         stringArrayList.add(oneObject.getString("countryname")); 



         /* 
       **How to use NewsAdapter here with  stringArrayList as data to be used** 
    */ 


        } catch (JSONException e) { 
         // Oops 
        } 
       } 
       String [] stringArray = stringArrayList.toArray(new String[stringArrayList.size()]); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 


     } 

     /** A method to download json data from url */ 
     private String downloadUrl(String strUrl) throws IOException{ 
      String data = ""; 
      InputStream iStream = null; 
      try{ 
        URL url = new URL(strUrl); 

        // Creating an http connection to communicate with url 
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 

        // Connecting to url 
        urlConnection.connect(); 

        // Reading data from url 
        iStream = urlConnection.getInputStream(); 

        BufferedReader br = new BufferedReader(new InputStreamReader(iStream)); 

        StringBuffer sb = new StringBuffer(); 

        String line = ""; 
        while((line = br.readLine()) != null){ 
         sb.append(line); 
        } 

        data = sb.toString(); 

        br.close(); 

      }catch(Exception e){ 
        Log.d("Exception while downloading url", e.toString()); 
      }finally{ 
        iStream.close(); 
      } 

      return data; 
     } 

     } 

NewsAdapter.java

 public class NewsAdapter extends ArrayAdapter<String> { 

private final Context context; 
private final String[] values; 

public NewsAdapter(Context context, String[] values) { 
    super(context, R.layout.drawer_list_item, values); 
    this.context = context; 
    this.values = values; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = (LayoutInflater)   context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      ................................ 
      ............... 
      ............... 
        ............... 

stringArrayList onPostExecute方法现在里面是含有我想填充inide使用NewsAdapter的listfragment的数据,但问题是如何使用NewsAdapter了的getJSON类里面,因为我尝试了几种方法,但没有什么工作的?

回答

1

试试这个:

接口

public interface ILoadDataListener { 
    public void onComplete(ArrayList<String> data); 
} 

片段

public static class NewsFragment extends ListFragment implements ILoadDataListener { 

    @Override 
      public void onActivityCreated(Bundle savedInstanceState) { 
      super.onActivityCreated(savedInstanceState); 

      // URL to the JSON data   
      String strUrl =  "http://wptrafficanalyzer.in/p/demo1/first.php/countries"; 
     // Creating a new non-ui thread task to download json data 

      GetJSON downloadTask = new GetJSON(this); // 

      // Starting the download process 
      downloadTask.execute(strUrl);  

      } 

    @Override 
    public void onComplete(ArrayList<String> result) { 
     YourAdapter adapter = new YourAdapter(..., result); 
     yourListView.setAdapter(adapter); 
    } 
} 

的AsyncTask

public class GetJSON extends AsyncTask<String, Integer, ArrayList<String>>{ // return an ArrayList of String 
    //.... Your declaration 
    private ILoadDataListener mListener; 

    public GetJSON(ILoadDataListener listener) { 
     this.mListener = listener; 
    } 

    @Override 
    public void onPostExecute(ArrayList<String> result) { 
     if (mListener != null) { 
      mListener.onComplete(result); 
     } 
    } 
} 

适配器

使用ArrayList<String> values;而不是String[] values;