나도 뉴스 앱을 만들어보자(1)~~

Words
361
Reading
2 min
Listen
Play
9y

안녕하세요!! wonnieyoon@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;
}

}


결과