안녕하세요!! @wonnieyoon입니다.
오늘은 네이버 뉴스를 가져오는 어플을 만들어보려고 합니다.
생각보다 간단합니다.
사용할것은 Jsoup Library + Android Studio 입니다.
Jsoup는 html의 내용을 쉽게 가져올수 있도록 도와주는 역할을 합니다.
코드
<MainActivity.java>
public class MainActivity extends AppCompatActivity {
private ArrayList<NewsItem> arrayList;
private NewsAdapter adapter;
private ListView listView;
StringBuilder news_title ;
StringBuilder news_link ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
news_title = new StringBuilder();
news_link = new StringBuilder();
listView = (ListView)findViewById(R.id.list_view);
arrayList = new ArrayList<NewsItem>();
adapter = new NewsAdapter(this,R.layout.news_item,arrayList);
listView.setAdapter(adapter);
NewsAsyncTask newsAsyncTask = new NewsAsyncTask();
newsAsyncTask.execute();
}
/** -- 뉴스 크롤링 하기 - */
private class NewsAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
try {
Document doc = Jsoup.connect("http://news.naver.com/main/hotissue/sectionList.nhn?mid=hot&sid1=101&cid=1074429").get();
Element hotNews = doc.select("div.lnb_today").get(0);
Elements news = hotNews.select("li");
for(Element e : news){
news_title.append( e.text().trim()).append("\n");
news_link.append( e.getElementsByAttribute("href").attr("href")).append("\n");
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
final StringTokenizer title = new StringTokenizer(news_title.toString(),"\n"); //뉴스 제목
final StringTokenizer link = new StringTokenizer(news_link.toString(),"\n"); //뉴스 링크
arrayList.clear(); // 리스트 초기화
while(title.hasMoreTokens()) //\n 제거
{
String n_title = title.nextToken();
String n_link = link.nextToken();
arrayList.add(new NewsItem(n_title,n_link));
}
adapter.notifyDataSetChanged();
}
}
}
<NewsAdapter.java>
public class NewsAdapter extends BaseAdapter {
Context context;
LayoutInflater inflater;
ArrayList<NewsItem> news;
int layout;
public NewsAdapter(Context context,int layout,ArrayList<NewsItem> news)
{
this.context = context;
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.news = news;
this.layout = layout;
}
@Override
public int getCount() {
return news.size();
}
@Override
public Object getItem(int i) {
return news.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
ViewHolder holder = new ViewHolder();
if(view == null)
{
LayoutInflater inflater = LayoutInflater.from(context);
view = inflater.inflate(layout,viewGroup,false);
holder.news_title = (TextView)view.findViewById(R.id.news_title_text);
view.setTag(holder);
}else {
holder = (ViewHolder) view.getTag();
}
NewsItem n = news.get(i);
if(n!=null)
{
holder.news_title.setText(news.get(i).getTitle());
}
return view;
}
static class ViewHolder{
TextView news_title;
}
}
<NewsItem.java>
public class NewsItem {
private String title;
private String link;
public NewsItem(String title, String link) {
this.title = title;
this.link = link;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
}