2014-10-04 32 views
-1

我是新來的android編程,我正在做一個Facebook應用程序。我得到了這個ListView,我將用它來顯示我從facebook獲得的一些信息。但問題是當Listview開始加載數據時,它在加載部分中被拖拽,並且它永遠佔用,但代碼中沒有錯誤。這裏是代碼:在Android ListView中加載像斯普林斯一樣

package com.example.forwardjunction;

import java.util.ArrayList; 
import java.util.HashMap; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 
import android.app.Activity; 
import android.app.Fragment; 
import android.app.FragmentTransaction; 
import android.app.ListFragment; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.content.res.Configuration; 
import android.os.Bundle; 
import android.util.Log; 
import android.util.TypedValue; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ListView; 
import android.widget.ScrollView; 
import android.widget.SimpleAdapter; 
import android.widget.TextView; 
import android.widget.Toast; 
import com.facebook.HttpMethod; 
import com.facebook.Request; 
import com.facebook.Response; 
import com.facebook.Session; 
import com.facebook.SessionState; 
import com.facebook.UiLifecycleHelper; 
import com.facebook.model.GraphObject; 

public class FragmentLayout extends Activity { 

    ProgressDialog mDialog; 
    static String postMessage; 
    static String from; 
    static String timeCreated; 
    static String postId; 
    static ArrayList<HashMap<String, String>> feedList; 
    private static final String TAG_MESSAGE = "message"; 
    private static final String TAG_ID = "id"; 
    private static final String TAG_NAME = "name"; 
    static ListView list; 
    TextView author, feedMessage; 
    static UiLifecycleHelper uiHelper; 


    public FragmentLayout() { 
     // TODO Auto-generated constructor stub 
    } 

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

     author = (TextView) findViewById(R.id.author); 
     feedMessage = (TextView) findViewById(R.id.message); 
     feedList = new ArrayList<HashMap<String, String>>(); 
     uiHelper = new UiLifecycleHelper(this, statusCallback); 
//  list = (ListView) findViewById(R.id.list); 

    } 

    public static class TitlesFragment extends ListFragment { 
     boolean mDualPane; 
     int mCurCheckPosition = 0; 


//  public View onCreateView(LayoutInflater inflater, ViewGroup container, 
//    Bundle savedInstanceState) { 
// 
//   return null; 
//  } 


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

      ListView list = getListView(); 
      feedList = new ArrayList<HashMap<String, String>>(); 

      Request loadPageFeed = new Request(Session.getActiveSession(), 
        "163340583656/posts", null, HttpMethod.GET, 
        new Request.Callback() { 

         @Override 
         public void onCompleted(Response response) { 
          // TODO Auto-generated method stub 
          Log.i("FEED RESPONSE", response.toString()); 

          try { 
           GraphObject graphObj = response.getGraphObject(); 
           JSONObject json = graphObj.getInnerJSONObject(); 
           JSONArray jArray = json.getJSONArray("data"); 
           for (int i = 0; i < jArray.length(); i++) { 
            JSONObject currObj = jArray.getJSONObject(i); 
            postId = currObj.getString("id"); 
            if (currObj.has("message")) { 
             postMessage = currObj.getString("message"); 
            } else if (currObj.has("story")) { 
             postMessage = currObj.getString("story"); 
            } else { 
             postMessage = "Forward Publication has posted something."; 
            } 
            JSONObject fromObj = currObj 
              .getJSONObject("from"); 
            from = fromObj.getString("name"); 
            timeCreated = currObj 
              .getString("created_time"); 

            HashMap<String, String> feed = new HashMap<String, String>(); 
            feed.put(TAG_ID, postId); 
            feed.put(TAG_MESSAGE, postMessage); 
            feed.put(TAG_NAME, from); 

            Log.i("passed", feed.toString()); 

            feedList.add(feed); 
           } 
          } catch (JSONException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } 
         } 
        }); 
      loadPageFeed.executeAsync(); 

      BaseAdapter adapter = new SimpleAdapter(getActivity(), feedList, 
        R.layout.feed_item, new String[] { TAG_MESSAGE, TAG_NAME, 
       TAG_ID }, new int[] { R.id.message, R.id.author, 
       R.id.id_tv }); 

      list.setAdapter(adapter); 
      adapter.notifyDataSetChanged(); 

      View detailsFrame = getActivity(). findViewById(R.id.details); 

      mDualPane = detailsFrame != null 
        && detailsFrame.getVisibility() == View.VISIBLE; 

      if (savedInstanceState != null) { 
       // Restore last state for checked position. 
       mCurCheckPosition = savedInstanceState.getInt("curChoice", 0); 
      } 

      if (mDualPane) { 
       getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
       showDetails(mCurCheckPosition); 
      } else { 
       getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
       getListView().setItemChecked(mCurCheckPosition, true); 
      } 
     } 

     @Override 
     public void onSaveInstanceState(Bundle outState) { 
      super.onSaveInstanceState(outState); 

      outState.putInt("curChoice", mCurCheckPosition); 
     } 

     @Override 
     public void onListItemClick(ListView l, View v, int position, long id) { 

      showDetails(position); 
     } 

     void showDetails(int index) { 
      mCurCheckPosition = index; 

      if (mDualPane) { 

       getListView().setItemChecked(index, true); 

       DetailsFragment details = (DetailsFragment) getFragmentManager() 
         .findFragmentById(R.id.details); 
       if (details == null || details.getShownIndex() != index) { 
        details = DetailsFragment.newInstance(index); 
        FragmentTransaction ft = getFragmentManager() 
          .beginTransaction(); 
        ft.replace(R.id.details, details); 
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
        ft.commit(); 
       } 

      } else { 

       Intent intent = new Intent(); 
       intent.setClass(getActivity(), DetailsActivity.class); 
       intent.putExtra("index", index); 
       startActivity(intent); 
      } 
     } 
    } 


    public static class DetailsActivity extends Activity { 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { 
       finish(); 
       return; 
      } 

      if (savedInstanceState == null) { 
       DetailsFragment details = new DetailsFragment(); 

       details.setArguments(getIntent().getExtras()); 

       getFragmentManager().beginTransaction() 
         .add(android.R.id.content, details).commit(); 
      } 
     } 
    } 



    public static class DetailsFragment extends Fragment { 

     public static DetailsFragment newInstance(int index) { 
      DetailsFragment f = new DetailsFragment(); 
      Bundle args = new Bundle(); 
      args.putInt("index", index); 
      f.setArguments(args); 

      return f; 
     } 

     public int getShownIndex() { 
      return getArguments().getInt("index", 0); 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 

      ScrollView scroller = new ScrollView(getActivity()); 
      TextView text = new TextView(getActivity()); 
      int padding = (int) TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP, 4, getActivity() 
          .getResources().getDisplayMetrics()); 
      text.setPadding(padding, padding, padding, padding); 
      scroller.addView(text); 
//   text.setText(Shakespeare.DIALOGUE[getShownIndex()]); 
      return scroller; 
     } 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     uiHelper.onResume(); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     uiHelper.onPause(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     uiHelper.onDestroy(); 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     uiHelper.onActivityResult(requestCode, resultCode, data); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle savedState) { 
     super.onSaveInstanceState(savedState); 
     uiHelper.onSaveInstanceState(savedState); 
    } 

    private Session.StatusCallback statusCallback = new Session.StatusCallback() { 
     @Override 
     public void call(Session session, SessionState state, 
       Exception exception) { 
      if (state.isOpened()) { 
       Log.d("FacebookSampleActivity", "Facebook session opened"); 
      } else if (state.isClosed()) { 
       Log.d("FacebookSampleActivity", "Facebook session closed"); 
      } 
     } 
    }; 

} 

而且繼承人的XML:

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

    <fragment 
     android:id="@+id/titles" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     class="com.example.forwardjunction.FragmentLayout$TitlesFragment" /> 

</FrameLayout> 

我希望你能幫助我。歡呼聲

*編輯>我認爲問題是,列表視圖是空的,我真的不知道問題出在哪裏

+0

還我試圖登錄列表視圖的響應,並且即時得到它,但不能負荷。 – d0tzz 2014-10-04 21:06:44

+0

你需要'onCompleted'中的'notifyDataSetChanged',在數據被有效加載後 – njzk2 2014-10-04 23:07:34

回答

0

因爲UI線程使用你的線程類使用的AsyncTask

阻止

而不是

類XYZ延伸的AsyncTask {

} 然後添加對overrididen方法 做在背景 上後執行

我米張貼礦的示例代碼

package com.example.urlconnectionclass; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Scanner; 

import org.json.JSONArray; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.Menu; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MainActivity extends Activity { 


    ProgressDialog pDialog; 
    String urlString="http://api.androidhive.info/contacts/"; 
    TextView tc; 
    String s; 
    JSONArray jr; 
    JSONObject jb,jb2; 
    ArrayList<HashMap<String, String>> contact; 
    String tagid="id"; 
    String tagname="name",tagemail="email",taggender="gender",tagadd="address"; 
    ListView lv; 

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


     lv=(ListView)findViewById(R.id.listView1); 
     contact = new ArrayList<HashMap<String,String>>(); 


     new urlconn().execute(); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 






    public class urlconn extends AsyncTask<Void, Void, Void> 
    { 
       @Override 
      protected void onPreExecute() { 
       // TODO Auto-generated method stub 
       super.onPreExecute(); 



      } 
     @Override 
     protected Void doInBackground(Void... params) { 
      // TODO Auto-generated method stub 





      try { 
       URL url= new URL(urlString); 
       HttpURLConnection conn =(HttpURLConnection)url.openConnection(); 

       conn.connect(); 

       InputStream is= conn.getInputStream(); 


       s=convertStreamToString(is); 


       jb = new JSONObject(s); 

       jr= jb.getJSONArray("contacts"); 

       for(int i=0;i<=jr.length();i++) 
       { 
        jb2=jr.getJSONObject(i); 


        String id=jb2.getString(tagid); 
        String name=jb2.getString(tagname); 
        String email=jb2.getString(tagemail); 
        String address=jb2.getString(tagadd); 
        String gender=jb2.getString("gender"); 

        HashMap<String, String> map = new HashMap<String, String>(); 

        map.put(tagid, id); 
        map.put(tagname, name); 
        map.put(tagemail, email); 
        map.put("gender", gender); 
        map.put(tagadd, address); 

        contact.add(map); 

       } 








      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 









      return null; 




     } 


     @Override 
     protected void onPostExecute(Void result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 

     String [] sr={tagid,tagname,tagemail,"gender",tagadd}; 
     int [] in= {R.id.textView1,R.id.textView2,R.id.textView3,R.id.textView4,R.id.textView5}; 

     SimpleAdapter sa= new SimpleAdapter(MainActivity.this, contact, R.layout.mapxml,sr, in); 
     lv.setAdapter(sa); 





     } 

     public String convertStreamToString(java.io.InputStream is) { 
      java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A"); 
      return s.hasNext() ? s.next() : ""; 
     } 

    } 







} 
+0

我不明白是什麼讓你覺得UI線程被阻塞 – njzk2 2014-10-04 23:06:56

+0

@Aakash謝謝你的回覆,我會試着用這個代碼你的。 – d0tzz 2014-10-05 02:47:50

+0

@ njzk2我認爲listview是空的,我想知道問題出在哪裏 – d0tzz 2014-10-05 06:01:21