티스토리 뷰

페이스북 연동하여 타임라인에 포스팅하기, 글 검색하기


http://best421.tistory.com/81

지난 글에 썼던 페이스북 연동하는 방법을 이용하여 글을 검색하고, 글을 작성하는 예제를 해보았다.


ActionBar를 생성하여 포스팅, 글 검색 메뉴 만들기

MainActivity에서 ActionBar을 생성하여 ActionBar에서 검색, 포스팅 할 수 있도록 앱을 구성하였다.

/**
* Action Bar 에 메뉴를 생성한다.
* @param menu
* @return
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.list_menu, menu);

// 검색 기능 활성화
SearchManager searchManager = (SearchManager) getSystemService(SEARCH_SERVICE);

// 검색 버튼 가져옴
MenuItem searchButton = menu.findItem(R.id.searchButton);

// 검색 버튼 클릭 했을 때 SearchView 를 가져온다.
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchButton);

// 검색 힌트를 설정한다.
searchView.setQueryHint("검색어를 입력하세요.");

// searchView 를 검색 가능한 위젯으로 설정한다.
searchView.setSearchableInfo(searchManager.getSearchableInfo( getComponentName() ));

//두 가지 검색 방법 (클릭 했을 때와 입력할 때)
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
/**
* 검색 버튼을 클릭했을 때 동작하는 이벤트
* @param s
* @return
*/
@Override
public boolean onQueryTextSubmit(String s) {
Intent intent = new Intent(MainActivity.this, SearchActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
//s 파라미터는 입력된 검색어
intent.putExtra("query", s);

startActivity(intent);

return true;
}

/**
* 검색어를 입력할 때 동장하는 이벤트
* @param s
* @return
*/
@Override
public boolean onQueryTextChange(String s) {
return false;
}
});

return true;
}

/**
* 메뉴 아이템을 클릭했을 때 발생되는 이벤트
* @param item
* @return
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if ( id == R.id.newPost ){
Intent intent = new Intent(this, WritePostActivity.class);
// intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivityForResult(intent, 1000);
// Toast.makeText(MainActivity.this, " 새 글 등록 버튼을 클릭했습니다.", Toast.LENGTH_SHORT).show();
return true;
}
return super.onOptionsItemSelected(item);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if ( requestCode == 1000 && resultCode == RESULT_OK ){
setTimeLine();
}
}



Detail Activity 만들기

다음으로 리스트의 글을 클릭하면 상세내용을 보여주는 Activity로 넘어가도록 해봤다.


SubActivity를 생성하고, MainActivity에서 리스트를 클릭하면 SubActivity로 넘어가는 코드를 추가하였다.


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

handler = new Handler();

lvArticleList = (ListView) findViewById(R.id.lvArticleListView);

facebook = new Facebook(this);
facebook.auth(new Facebook.After() {
@Override
public void doAfter(Context context) {
// 인증이 끝나면 동작
setTimeLine();
}
});

lvArticleList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent intent = new Intent(view.getContext(), SubActivity.class);

String articleId = ( (Post) lvArticleList.getAdapter().getItem(i)).getId();
Log.d("FACEBOOK", articleId);

intent.putExtra("articleId", articleId);

startActivity(intent);

}
});

}



SubActivity.java

package com.ktds.jmj.customlistview;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.widget.TextView;

import com.ktds.jmj.customlistview.facebook.Facebook;
import com.restfb.types.Post;

public class SubActivity extends ActionBarActivity {

private TextView tvSubject;
private TextView tvAuthor;
private TextView tvHitCount;
private Facebook facebook;
private Handler handler;

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

ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);

handler = new Handler();
tvSubject = (TextView) findViewById(R.id.tvSubject);
tvAuthor = (TextView) findViewById(R.id.tvAuthor);
tvHitCount = (TextView) findViewById(R.id.tvHitCount);

Intent intent = getIntent();

final String articleId = intent.getStringExtra("articleId");

facebook = new Facebook(this);
facebook.auth(new Facebook.After() {
@Override
public void doAfter(Context context) {
// 인증이 끝나면 동작
setDetail(articleId);
}
});
}

public void setDetail(String articleId) {
facebook.findPost(articleId, new Facebook.DetailPost(){
@Override
public void showPost(final Post post) {
handler.post(new Runnable() {
@Override
public void run() {
tvSubject.setText(post.getMessage());
tvAuthor.setText(post.getFrom().getName());
tvHitCount.setText(post.getCreatedTime()+"");
}
});
}
});
}

}


검색 버튼을 클릭했을 때 넘어가는 SearchActivity 만들기

위에서 생성한 ActionBar에서 검색 버튼을 클릭했을 때 동작하는 이벤트로 Intent가 SearchActivity로 넘어가도록 작성해두었다.

그러므로 필요한 SearchActivity를 만들었다.

package com.ktds.jmj.customlistview;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.ktds.jmj.customlistview.facebook.Facebook;
import com.restfb.types.Post;

import java.util.ArrayList;
import java.util.List;

public class SearchActivity extends ActionBarActivity {

private final int SEPARATE = 500;
private ListView lvArticleList;
private Facebook facebook;
private Handler handler;

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

handler = new Handler();
//
lvArticleList = (ListView) findViewById(R.id.lvArticleListView);

ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);

// 검색어 받아오기
Intent intent = getIntent();
final String query = intent.getStringExtra("query");

// 검색어를 ActionBar 에 보여주기
setTitle("검색어 : " + query);

facebook = new Facebook(this);

facebook.auth(new Facebook.After() {
@Override
public void doAfter(Context context) {
setTimeLine(query);
}
});

lvArticleList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent intent = new Intent(view.getContext(), SubActivity.class);

String articleId = ( (Post) lvArticleList.getAdapter().getItem(i)).getId();
Log.d("FACEBOOK", articleId);

intent.putExtra("articleId", articleId);

startActivity(intent);

}
});

}

public void setTimeLine(final String query){
if( facebook.isLogin() ){
// .... timeLine 가져오기
facebook.getTimeLine(new Facebook.TimelineSerializable() {
@Override
public void serialize(final List<Post> posts) {

int postSize = posts.size();
int threadCount = 0;

if ( postSize > SEPARATE ) {
threadCount = Math.round(postSize / SEPARATE);
}

threadCount++;

final List<Post> searchPost = new ArrayList<Post>();

final BaseAdapter baseAdapter = new ArticleListViewAdapter(SearchActivity.this, searchPost);

handler.post(new Runnable() {
@Override
public void run() {
lvArticleList.setAdapter(baseAdapter);

}
});

for( int i = 0; i < threadCount; i++ ){
final int startIndex = i * SEPARATE;
new Thread(new Runnable() {
@Override
public void run() {
Post post = null;

for( int j = startIndex; j < (startIndex + SEPARATE); j++ ) {
try {
post = posts.get(j);
}
catch (RuntimeException re){
break;
}

if ( post.getMessage() !=null && post.getMessage().length() > 0){
if ( post.getMessage().toLowerCase().contains(query.toLowerCase()) ){ // 검색어가 존재하지 않는다면
setPost(post, searchPost, baseAdapter);

}
}
else if ( post.getStory() !=null && post.getStory().length() > 0){
if ( post.getStory().toLowerCase().contains(query.toLowerCase()) ){ // 검색어가 존재하지 않는다면
setPost(post, searchPost, baseAdapter);
}
}
else if ( post.getLink() !=null && post.getLink().length() > 0){
if ( post.getLink().toLowerCase().contains(query.toLowerCase()) ){ // 검색어가 존재하지 않는다면
setPost(post, searchPost, baseAdapter);
}
}

}

}
}).start();
}



}
});
}
}

private void setPost(Post post, final List<Post> searchPost, final BaseAdapter baseAdapter) {
searchPost.add(post);
handler.post(new Runnable() {
@Override
public void run() {
baseAdapter.notifyDataSetChanged();
}
});

}

private class ArticleListViewAdapter extends BaseAdapter {

/**
* ListView Item을 셋팅할 요청자의 객체가 들어감.
*/
private Context context;

private Post article;
/**
* ListView에 셋팅할 Item 정보들.
*/
private List<Post> articleList;

public ArticleListViewAdapter(Context context, List<Post> articleList) {
this.context = context;
this.articleList = articleList;
}

/**
* 아이템의 속성에 따라서 보여질 Item Layout을 정해준다.
* @param position
* @return
*/
@Override
public int getItemViewType(int position) {
// return super.getItemViewType(position);

/**
* 만약, Messagenull 이 아니라면 list_item_message 를 보여주고,
* Story null 이 아니라면 list_item_story 를 보여주고,
* link null 이 아니라면 list_item_link 를 보여준다.
*/
article = (Post) getItem(position);
if ( article.getMessage() != null && article.getMessage().length() > 0 ){
return 0;
}
else if ( article.getStory() != null && article.getStory().length() > 0 ){
return 1;
}
else if ( article.getLink() != null && article.getLink().length() > 0 ){
return 2;
}

return 0;
}

public int getLayoutType( int index ){
if ( index == 0 ) {
return R.layout.list_item_message;
}
else if ( index == 1 ) {
return R.layout.list_item_story;
}
else if ( index == 2 ){
return R.layout.list_item_link;
}

return -1;
}

/**
* Item Layout 의 개수를 정한다.
* @return
*/
@Override
public int getViewTypeCount() {
return 3;
}

/**
* ListView에 셋팅할 아이템들의 수
* @return
*/
@Override
public int getCount() {
return this.articleList.size();
}

/**
* position 번째 Item 정보를 가져옴.
* @param position
* @return
*/
@Override
public Object getItem(int position) {
return this.articleList.get(position);
}

/**
* Item Index를 가져옴
* Item Index == position
* @param position
* @return
*/
@Override
public long getItemId(int position) {
return position;
}

/**
* ListViewItem을 셋팅함
* @param position : 현재 보여질 ItemIndex , 0부터 getCount() 까지 증가함
* @param convertView : ListView Item Cell 객체를 가져옴.
* @param parent : ListView
* @return
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {


ItemHolder holder = null;
int layoutType = getItemViewType(position);
//가장 효율적인 방법
if (convertView == null) {

// Item Cell Layout을 적용시킬 Inflater 객체
LayoutInflater inflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);

// Item Cell Layout을 적용시킨다.
// false는 덮어쓸것이냐 말것이냐 대부분 false 를 쓴다.
convertView = inflater.inflate(getLayoutType(layoutType), parent, false);

holder = new ItemHolder();

if( layoutType == 0 ) {
holder.tvSubject = (TextView) convertView.findViewById(R.id.tvSubject);
holder.tvAuthor = (TextView) convertView.findViewById(R.id.tvAuthor);
holder.tvHitCount = (TextView) convertView.findViewById(R.id.tvHitCount);
}
else if( layoutType == 1 ) {
holder.tvSubject = (TextView) convertView.findViewById(R.id.tvSubject);
}
else if( layoutType == 2 ){
holder.tvSubject = (TextView) convertView.findViewById(R.id.tvSubject);
}
convertView.setTag(holder);

}
else {
holder = (ItemHolder) convertView.getTag();
}


article = (Post) getItem(position);

if( layoutType == 0 ){
holder.tvSubject.setText(article.getMessage());
holder.tvAuthor.setText(article.getFrom().getName());

if ( article.getLikes() == null )
holder.tvHitCount.setText("0");
else
holder.tvHitCount.setText(article.getLikes().getData().size() + "");
}
else if ( layoutType == 1 ){
holder.tvSubject.setText(article.getStory());
}
else if ( layoutType == 2 ){
holder.tvSubject.setText(article.getLink());
holder.tvSubject.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent intent = new Intent ( Intent.ACTION_VIEW, Uri.parse(article.getLink()));
startActivity(intent);
}
});
}

return convertView;
}
}

private class ItemHolder {

public TextView tvSubject;
public TextView tvAuthor;
public TextView tvHitCount;
}
}



페이스북 클래스에 검색기능 추가하기

public void findPost(final String postId, final DetailPost detailPost) {
new Thread(new Runnable() {
@Override
public void run(){
Post post = myFacebook.fetchObject(postId, Post.class, Parameter.with("fields", "id,from,message,likes,created_time"));
detailPost.showPost(post);
}
}).start();

}




새글 등록 버튼을 눌렀을 때 동작하는 WritePostActivity 만들기

package com.ktds.jmj.customlistview;

import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.Toast;

import com.ktds.jmj.customlistview.facebook.Facebook;

public class WritePostActivity extends ActionBarActivity {

private EditText etPost;
private Facebook myFacebook;

private Handler handler;

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

myFacebook = new Facebook(this);
handler = new Handler();

setTitle("New Post");

ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);

etPost = (EditText) findViewById(R.id.etPost);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.wirte_menu, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId();

if (itemId == R.id.done) {
// Validation Check
// 아무것도 입력하지 않았다면
if ( etPost.getText().toString().length() == 0 ) {
// 글자를 입력하라는 메시지를 띄운다.
Toast.makeText(WritePostActivity.this, "포스트 내용을 입력해주세요.", Toast.LENGTH_SHORT).show();
return false;
}
else {
// facebook 으로 포스트 전송
myFacebook.auth(new Facebook.After() {
@Override
public void doAfter(Context context) {
writePost();
}
});
}
return true;
}
return super.onOptionsItemSelected(item);
}

public void writePost() {
myFacebook.publishing(etPost.getText().toString(), new Facebook.After() {
@Override
public void doAfter(Context context) {
handler.post(new Runnable() {
@Override
public void run() {
setResult(RESULT_OK);
finish();
}
});
}
});
}
}





페이스북 클래스에 포스팅기능 추가하기


public void publishing(final String message, final After after) {

new Thread(new Runnable() {
@Override
public void run() {
FacebookType facebookType = myFacebook.publish("me/feed", FacebookType.class, Parameter.with("message", message));
after.doAfter(context);
}
}).start();


}





MainActivity 전체코드

package com.ktds.jmj.customlistview;

import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.SearchView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.ktds.jmj.customlistview.facebook.Facebook;
import com.restfb.types.Post;

import java.util.List;

public class MainActivity extends ActionBarActivity {

private ListView lvArticleList;
private Facebook facebook;
private Handler handler;

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

handler = new Handler();

lvArticleList = (ListView) findViewById(R.id.lvArticleListView);

facebook = new Facebook(this);
facebook.auth(new Facebook.After() {
@Override
public void doAfter(Context context) {
// 인증이 끝나면 동작
setTimeLine();
}
});

lvArticleList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent intent = new Intent(view.getContext(), SubActivity.class);

String articleId = ( (Post) lvArticleList.getAdapter().getItem(i)).getId();
Log.d("FACEBOOK", articleId);

intent.putExtra("articleId", articleId);

startActivity(intent);

}
});


}

/**
* Action Bar 에 메뉴를 생성한다.
* @param menu
* @return
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.list_menu, menu);

// 검색 기능 활성화
SearchManager searchManager = (SearchManager) getSystemService(SEARCH_SERVICE);

// 검색 버튼 가져옴
MenuItem searchButton = menu.findItem(R.id.searchButton);

// 검색 버튼 클릭 했을 때 SearchView 를 가져온다.
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchButton);

// 검색 힌트를 설정한다.
searchView.setQueryHint("검색어를 입력하세요.");

// searchView 를 검색 가능한 위젯으로 설정한다.
searchView.setSearchableInfo(searchManager.getSearchableInfo( getComponentName() ));

//두 가지 검색 방법 (클릭 했을 때와 입력할 때)
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
/**
* 검색 버튼을 클릭했을 때 동작하는 이벤트
* @param s
* @return
*/
@Override
public boolean onQueryTextSubmit(String s) {
Intent intent = new Intent(MainActivity.this, SearchActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
//s 파라미터는 입력된 검색어
intent.putExtra("query", s);

startActivity(intent);

return true;
}

/**
* 검색어를 입력할 때 동장하는 이벤트
* @param s
* @return
*/
@Override
public boolean onQueryTextChange(String s) {
return false;
}
});

return true;
}

/**
* 메뉴 아이템을 클릭했을 때 발생되는 이벤트
* @param item
* @return
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if ( id == R.id.newPost ){
Intent intent = new Intent(this, WritePostActivity.class);
// intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivityForResult(intent, 1000);
// Toast.makeText(MainActivity.this, " 새 글 등록 버튼을 클릭했습니다.", Toast.LENGTH_SHORT).show();
return true;
}
return super.onOptionsItemSelected(item);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if ( requestCode == 1000 && resultCode == RESULT_OK ){
setTimeLine();
}
}


public void setTimeLine() {
if( facebook.isLogin() ){
// .... timeLine 가져오기
facebook.getTimeLine(new Facebook.TimelineSerializable() {
@Override
public void serialize(final List<Post> posts) {

handler.post(new Runnable() {
@Override
public void run() {
lvArticleList.setAdapter(new ArticleListViewAdapter(MainActivity.this, posts));

}
});
}
});
}
}

private class ArticleListViewAdapter extends BaseAdapter {

/**
* ListView Item을 셋팅할 요청자의 객체가 들어감.
*/
private Context context;

private Post article;
/**
* ListView에 셋팅할 Item 정보들.
*/
private List<Post> articleList;

public ArticleListViewAdapter(Context context, List<Post> articleList) {
this.context = context;
this.articleList = articleList;
}

/**
* 아이템의 속성에 따라서 보여질 Item Layout을 정해준다.
* @param position
* @return
*/
@Override
public int getItemViewType(int position) {
// return super.getItemViewType(position);

/**
* 만약, Messagenull 이 아니라면 list_item_message 를 보여주고,
* Story null 이 아니라면 list_item_story 를 보여주고,
* link null 이 아니라면 list_item_link 를 보여준다.
*/
article = (Post) getItem(position);
if ( article.getMessage() != null && article.getMessage().length() > 0 ){
return 0;
}
else if ( article.getStory() != null && article.getStory().length() > 0 ){
return 1;
}
else if ( article.getLink() != null && article.getLink().length() > 0 ){
return 2;
}

return 0;
}

public int getLayoutType( int index ){
if ( index == 0 ) {
return R.layout.list_item_message;
}
else if ( index == 1 ) {
return R.layout.list_item_story;
}
else if ( index == 2 ){
return R.layout.list_item_link;
}

return -1;
}

/**
* Item Layout 의 개수를 정한다.
* @return
*/
@Override
public int getViewTypeCount() {
return 3;
}

/**
* ListView에 셋팅할 아이템들의 수
* @return
*/
@Override
public int getCount() {
return this.articleList.size();
}

/**
* position 번째 Item 정보를 가져옴.
* @param position
* @return
*/
@Override
public Object getItem(int position) {
return this.articleList.get(position);
}

/**
* Item Index를 가져옴
* Item Index == position
* @param position
* @return
*/
@Override
public long getItemId(int position) {
return position;
}

/**
* ListViewItem을 셋팅함
* @param position : 현재 보여질 ItemIndex , 0부터 getCount() 까지 증가함
* @param convertView : ListView Item Cell 객체를 가져옴.
* @param parent : ListView
* @return
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {


ItemHolder holder = null;
int layoutType = getItemViewType(position);
//가장 효율적인 방법
if (convertView == null) {

// Item Cell Layout을 적용시킬 Inflater 객체
LayoutInflater inflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE);

// Item Cell Layout을 적용시킨다.
// false는 덮어쓸것이냐 말것이냐 대부분 false 를 쓴다.
convertView = inflater.inflate(getLayoutType(layoutType), parent, false);

holder = new ItemHolder();

if( layoutType == 0 ) {
holder.tvSubject = (TextView) convertView.findViewById(R.id.tvSubject);
holder.tvAuthor = (TextView) convertView.findViewById(R.id.tvAuthor);
holder.tvHitCount = (TextView) convertView.findViewById(R.id.tvHitCount);
}
else if( layoutType == 1 ) {
holder.tvSubject = (TextView) convertView.findViewById(R.id.tvSubject);
}
else if( layoutType == 2 ){
holder.tvSubject = (TextView) convertView.findViewById(R.id.tvSubject);
}
convertView.setTag(holder);

}
else {
holder = (ItemHolder) convertView.getTag();
}


article = (Post) getItem(position);

if( layoutType == 0 ){
holder.tvSubject.setText(article.getMessage());
holder.tvAuthor.setText(article.getFrom().getName());

if ( article.getLikes() == null )
holder.tvHitCount.setText("0");
else
holder.tvHitCount.setText(article.getLikes().getData().size() + "");
}
else if ( layoutType == 1 ){
holder.tvSubject.setText(article.getStory());
}
else if ( layoutType == 2 ){
holder.tvSubject.setText(article.getLink());
holder.tvSubject.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
Intent intent = new Intent ( Intent.ACTION_VIEW, Uri.parse(article.getLink()));
startActivity(intent);
}
});
}


return convertView;
}
}

private class ItemHolder {

public TextView tvSubject;
public TextView tvAuthor;
public TextView tvHitCount;
}
}



Facebook 전체코드

package com.ktds.jmj.customlistview.facebook;

import android.content.Context;
import android.util.Log;

import com.restfb.Connection;
import com.restfb.DefaultFacebookClient;
import com.restfb.FacebookClient;
import com.restfb.Parameter;
import com.restfb.Version;
import com.restfb.types.FacebookType;
import com.restfb.types.Post;
import com.restfb.types.User;

import java.util.ArrayList;
import java.util.List;

/**
* Created by 206-020 on 2016-06-14.
*/
public class Facebook {

/**
* 인증과 관련된 상수들
*/
private static final String APP_ID = "자신의 APP ID";
private static final String APP_SECRET = "APP_SECRET";
private static final String ACCESS_TOKEN = "";

private Context context;

public Facebook(Context context) {
this.context = context;
}

/**
* Facebook 인증 객체
*/
private FacebookClient myFacebook;

private boolean isLogin;



/**
* Facebook 으로 로그인 한다.
* @return : 로그인 성공시 true
*/
public void auth(final After after) {

new Thread(new Runnable() {
@Override
public void run() {
//Facebook 로그인
myFacebook = new DefaultFacebookClient(ACCESS_TOKEN, Version.LATEST);

// 로그인이 성공했는지 체크한다.
// 로그인된 계정의 정보를 가져온다.
User me = myFacebook.fetchObject("me", User.class);

Log.d("FACEBOOK", me.getName() + " 계정으로 로그인 함.");

isLogin = me != null;

if( isLogin ) {
after.doAfter(context);
//좋지않은방식
// // instanceof 는 상속관계를 물어보는 것이다.
// if ( context instanceof MainActivity ) {
// ((MainActivity) context).setTimeLine();
// }
// else if ( context instanceof WritePostActivity ){
// ((WritePostActivity) context).writePost();
// }
}
}
}).start();

}

public boolean isLogin() {
return isLogin;
}


public void getTimeLine( final TimelineSerializable timelineSerializable ) {
new Thread(new Runnable() {
@Override
public void run() {
// 나의 타임라인에서 포스트들을 가져온다.
Connection<Post> feeds = myFacebook.fetchConnection("me/feed", Post.class, Parameter.with("fields", "id,from,likes,message,story,link"));

List<Post> postList = new ArrayList<Post>();
// 타임라인 정보들...
for (List<Post> posts: feeds ) {
postList.addAll(posts);


}
timelineSerializable.serialize(postList);

}
}).start();

}


public void publishing(final String message, final After after) {

new Thread(new Runnable() {
@Override
public void run() {
FacebookType facebookType = myFacebook.publish("me/feed", FacebookType.class, Parameter.with("message", message));
after.doAfter(context);
}
}).start();


}

public interface TimelineSerializable {

public void serialize(List<Post> posts);
}

public interface After {
public void doAfter(Context context);
}

public void findPost(final String postId, final DetailPost detailPost) {
new Thread(new Runnable() {
@Override
public void run(){
Post post = myFacebook.fetchObject(postId, Post.class, Parameter.with("fields", "id,from,message,likes,created_time"));
detailPost.showPost(post);
}
}).start();

}

public interface DetailPost {
public void showPost (Post post);
}



}


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함