arrayAdapter = бесконечный цикл? (см. код) - PullRequest
3 голосов
/ 04 января 2012

Итак, у меня есть 2 вопроса об этом ArrayAdapter:
1. Третий параметр List<RSSItem> list в конструкторе автоматически анализируется в getView, а position будет перебирать каждый элемент в этом list?(единственное, что нужно сделать, это вызвать super, чтобы передать этот список в качестве параметра?)

2. В конце кода у нас есть new MyCustomAdapter(this, R.layout.row, myRssFeed.getList());, как это может работать, а не создаватьбесконечный цикл в коде?потому что в конце arrayAdapter класс вызывает себя для перезапуска адаптера ... как заканчивается адаптер?

вот код (источник: http://android -er.blogspot.com /2010/07 / simple-rss-reader-with-options-menu-to.html ):

public class AndroidRssReader extends ListActivity {

private RSSFeed myRssFeed = null;

TextView feedTitle;
TextView feedDescribtion;
TextView feedPubdate;
TextView feedLink;

public class MyCustomAdapter extends ArrayAdapter<RSSItem> {

 public MyCustomAdapter(Context context, int textViewResourceId,
   List<RSSItem> list) {
  super(context, textViewResourceId, list);
 }

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  // TODO Auto-generated method stub
  //return super.getView(position, convertView, parent);

  View row = convertView;

  if(row==null){
   LayoutInflater inflater=getLayoutInflater();
   row=inflater.inflate(R.layout.row, parent, false);
  }

  TextView listTitle=(TextView)row.findViewById(R.id.listtitle);
  listTitle.setText(myRssFeed.getList().get(position).getTitle());
  TextView listPubdate=(TextView)row.findViewById(R.id.listpubdate);
  listPubdate.setText(myRssFeed.getList().get(position).getPubdate());

  if (position%2 == 0){
   listTitle.setBackgroundColor(0xff101010);
   listPubdate.setBackgroundColor(0xff101010);
  }
  else{
   listTitle.setBackgroundColor(0xff080808);
   listPubdate.setBackgroundColor(0xff080808);
  }

  return row;
 }
}

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

 feedTitle = (TextView)findViewById(R.id.feedtitle);
 feedDescribtion = (TextView)findViewById(R.id.feeddescribtion);
 feedPubdate = (TextView)findViewById(R.id.feedpubdate);
 feedLink = (TextView)findViewById(R.id.feedlink);

      readRss();
  }

  private void readRss(){

 feedTitle.setText("--- wait ---");
 feedDescribtion.setText("");
 feedPubdate.setText("");
 feedLink.setText("");
 setListAdapter(null);

 Toast.makeText(this, "Reading RSS, Please wait.", Toast.LENGTH_LONG).show();

      try {
  URL rssUrl = new URL("http://www.gov.hk/en/about/rss/govhkrss.data.xml");
  SAXParserFactory mySAXParserFactory = SAXParserFactory.newInstance();
  SAXParser mySAXParser = mySAXParserFactory.newSAXParser();
  XMLReader myXMLReader = mySAXParser.getXMLReader();
  RSSHandler myRSSHandler = new RSSHandler();
  myXMLReader.setContentHandler(myRSSHandler);
  InputSource myInputSource = new InputSource(rssUrl.openStream());
  myXMLReader.parse(myInputSource);

  myRssFeed = myRSSHandler.getFeed();

 } catch (MalformedURLException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 } catch (ParserConfigurationException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 } catch (SAXException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }

 if (myRssFeed!=null)
 {
  Calendar c = Calendar.getInstance();
     String strCurrentTiime =  "\n(Time of Reading - "
           + c.get(Calendar.HOUR_OF_DAY)
           + " : "
           + c.get(Calendar.MINUTE) + ")\n";

  feedTitle.setText(myRssFeed.getTitle() + strCurrentTiime);
  feedDescribtion.setText(myRssFeed.getDescription());
  feedPubdate.setText(myRssFeed.getPubdate());
  feedLink.setText(myRssFeed.getLink());

  MyCustomAdapter adapter =
   new MyCustomAdapter(this, R.layout.row, myRssFeed.getList());
  setListAdapter(adapter);

 }
  }

РЕДАКТИРОВАТЬ: в этом примере как «вид» может быть нулевым?

private class MyAdapter extends ArrayAdapter<String> {

    public MyAdapter(Context context, List<String> objects) {
        super(context, R.layout.list_item, R.id.text, objects);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        Wrapper wrapper;

        if (view == null) {
            view = mInflater.inflate(R.layout.list_item, null);
            wrapper = new Wrapper(view);
            view.setTag(wrapper);
        } else {
            wrapper = (Wrapper) view.getTag();
        }

Спасибо

Ответы [ 3 ]

4 голосов
/ 04 января 2012
  1. Да! есть метод getItem(int position), который будет return предмет в этой конкретной позиции из вашего обеспечения List. а другой метод int getCount() сообщит adapter о том, сколько их предметов.

  2. это не бесконечный цикл. ArrayAdapter просто вызывает super, чтобы использовать унаследованные свойства и оба метода getItem() и getCount()

1 голос
/ 04 января 2012

Чтобы понять это, попробуйте использовать «BaseAdapter».Это стандартный адаптер, предоставляемый в Android, с очень простой функциональностью, и вам нужно указать все в нем.

Но в двух словах, адаптер не будет отображать строки в списке, равныеколичество элементов в списке.

В BaseAdapter предусмотрен метод "getCount ()", который определяет, сколько строк будет заполнено адаптером в целом (исключая концепцию эффективного адаптера, т. е. возможность повторного использования).мнений, для простоты объяснения).

В случае «ArrayAdapter», когда вы вызываете его super с предоставлением ему списка элементов, «getCount ()» вызывается iteself, и определяется noсамим адаптером, генерирующим такое же количество просмотров.

0 голосов
/ 04 января 2012

Изменить

  TextView listTitle=(TextView)row.findViewById(R.id.listtitle);
  listTitle.setText(myRssFeed.getList().get(position).getTitle());
  TextView listPubdate=(TextView)row.findViewById(R.id.listpubdate);
  listPubdate.setText(myRssFeed.getList().get(position).getPubdate());

На это.

  TextView listTitle=(TextView)row.findViewById(R.id.listtitle);
  listTitle.setText(((RSSItem)getItem()).getTitle());
  TextView listPubdate=(TextView)row.findViewById(R.id.listpubdate);
  listPubdate.setText(((RSSItem)getItem()).getPubdate());

Использовать getItem() вместо списка.Адаптер не будет переходить в бесконечный цикл.Хотя для ArrayAdapter нет необходимости пытаться использовать базовый адаптер и реализовывать методы getItem() и getCount().

...