2013-10-27 42 views
0

我想绑定ListViewArrayList在按钮上点击(btnGetPost)。我对Android编程非常非常新颖。现在我可以将Facebook群组文章作为JSON响应来检索。然后我循环浏览这个JSON对象并将所有消息添加到ArrayList绑定列表视图ArrayList - Android

现在我的问题是,我如何在button click上显示ListView中的所有消息。我的意思是我该如何将ArrayList绑定到ListView?请指点我正确的方向。

package org.example.fbapp; 



@SuppressWarnings("deprecation") 
public class FBAppActivity extends Activity { 

    // Your Facebook APP ID 
    private static String APP_ID = "********************"; 

    // JSON Node names 
    private static final String TAG_DATA = "data"; 
    private static final String TAG_MESSAGE = "message"; 

    // data JSONArray 
    JSONArray data = null; 

    // Instance of Facebook Class 
    private Facebook facebook = new Facebook(APP_ID); 
    private AsyncFacebookRunner mAsyncRunner; 
    String FILENAME = "AndroidSSO_data"; 
    private SharedPreferences mPrefs; 

    // Hashmap for ListView 
    ArrayList<HashMap<String, String>> messages = new ArrayList<HashMap<String, String>>(); 

    // Buttons 

    Button btnGetPost; 

    @SuppressWarnings("deprecation") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_fbapp); 


     btnGetPost = (Button) findViewById(R.id.btn_group_posts); 
     mAsyncRunner = new AsyncFacebookRunner(facebook); 


     /** 
     * Get Posts from Group 
     * */ 
     btnGetPost.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       getGPosts(); 
      } 
     }); 


    } 



    @SuppressWarnings("deprecation") 
    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     facebook.authorizeCallback(requestCode, resultCode, data); 
    } 



    /** 
    * Get Group Posts by making request to Facebook Graph API 
    * */ 
    @SuppressWarnings("deprecation") 
    public void getGPosts() { 
     mAsyncRunner.request("203153109726651/feed", new RequestListener() { 
      @Override 
      public void onComplete(String response, Object state) { 
       Log.d("GET POSTS", response); 
       String json = response; 

       try { 

        // Facebook Profile JSON data 
        JSONObject obj = new JSONObject(json); 
        JSONArray finalObj = obj.getJSONArray("data"); 

        for (int i = 0; i < finalObj.length(); i++) { 

         final String message = finalObj.getJSONObject(i) 
           .getString("message"); 

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

         // adding each child node to HashMap key => value 
         map.put(TAG_MESSAGE, message); 

         // adding HashList to ArrayList 
         messages.add(map); 


         runOnUiThread(new Runnable() { 

          @Override 
          public void run() { 
           Toast.makeText(getApplicationContext(), 
             "Name: " + message, Toast.LENGTH_LONG) 
             .show(); 
          } 

         }); 
        } 

       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 

     } 

      @Override 
      public void onIOException(IOException e, Object state) { 
      } 

      @Override 
      public void onFileNotFoundException(FileNotFoundException e, 
        Object state) { 
      } 

      @Override 
      public void onMalformedURLException(MalformedURLException e, 
        Object state) { 
      } 

      @Override 
      public void onFacebookError(FacebookError e, Object state) { 
      } 
     }); 
    } 


    } 



} 

回答

0

您的数据绑定到通过适配器的ListView。在这种情况下,编写从ArrayAdapter 派生自己的适配器会很有用您可以将数据的引用保留为自定义适配器的成员。

+0

请给我看一些示例代码。正如我在Android编程新手中提到的那样,我无法关注你。 – Monodeep

1

基本上,如果你在你的ArrayList中的数据,

那么你可以把它放到适配器将数据加载到视图列表视图

ListView和适配器BasicsHow它的工作原理:

  1. 的ListView要求适配器“给我一个视图”(getView)列表中的每个项目
  2. 返回并显示新视图

所以,你可以尝试重写BaseAdapter

压倒一切的BaseAdapter的例子: 你可以只是要注意getView方法。这几乎是适配器的本质。

private class MyCustomAdapter extends BaseAdapter { 


    private ArrayList mData = new ArrayList(); 
    private LayoutInflater mInflater; 

    public MyCustomAdapter() { 
     mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public void addItem(final String item) { 
     mData.add(item); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getCount() { 
     return mData.size(); 
    } 

    @Override 
    public String getItem(int position) { 
     return mData.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     System.out.println("getView " + position + " " + convertView); 
     ViewHolder holder = null; 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.item1, null); 
      holder = new ViewHolder(); 
      holder.textView = (TextView)convertView.findViewById(R.id.text); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder)convertView.getTag(); 
     } 
     holder.textView.setText(mData.get(position)); 
     return convertView; 
    } 

} 

然后,你可以简单地做下面你ListView view;

view.setAdapter(myAdapter); 

更详细的解释,在这个博客 http://android.amberfog.com/?p=296

(这不是我的。我复制了示例代码和一些从本页开始的解释)