2012-04-19 4 views
0

Я пишу приложение, которое получает информацию из RSS-канала, анализирует его с помощью анализатора DOM (проблемы с RSS-лентой клиентов), а затем отображает проанализированные объекты в ListView.пользовательский ArrayAdapter не называется

По какой-то причине getView() не вызывается ...

вот код для деятельности:

public class NoPicList extends Activity { 
    ListView list; 
    NoPicAdapterV2 adapter2; 
    ProgressDialog mDialog; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.no_pic_list); 
     list = (ListView) findViewById(R.id.noPicListView); 

     // get the request from the main activity 
     Bundle b = getIntent().getExtras(); 
     String request = b.getString("REQUEST"); 

     mDialog = new ProgressDialog(this); 
     mDialog.setCancelable(false); 
     mDialog.setMessage("Lodaing Data"); 
     mDialog.show(); 

     new GetNewsAndCalendar().execute(request); 
    } 

    @Override 
    protected void onPause() { 
     mDialog.dismiss(); 
     super.onPause(); 
    } 

    class GetNewsAndCalendar extends 
     AsyncTask<String, Void, ArrayList<Message>> { 

     @Override 
     protected ArrayList<Message> doInBackground(String... params) { 
      String url = params[0]; 
      DOMFeedParser parser = new DOMFeedParser(url); 
      return parser.parse(); 
     } 

     @Override 
     protected void onPostExecute(ArrayList<Message> result) { 
      adapter2 = new NoPicAdapterV2(NoPicList.this, R.layout.no_pic_list_item, result); 
      list.setAdapter(adapter2); 
      mDialog.dismiss(); 
      } 

    } 

} 

здесь код адаптера:

public class NoPicAdapterV2 extends ArrayAdapter<NewAndCalendar> { 
    private ArrayList<Message> data; 
    private LayoutInflater inflator; 
    private Activity mActivity; 

    public NoPicAdapterV2(Context context, int textViewResourceId, 
     ArrayList<Message> result) { 
     super(context, textViewResourceId); 
     data = (ArrayList<Message>) result; 
     mActivity = (Activity) context; 
     inflator = (LayoutInflater) mActivity 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View vi = convertView; 
     if (vi == null) 
      vi = inflator.inflate(R.layout.no_pic_list_item, parent, false); 

     TextView title = (TextView) vi.findViewById(R.id.noPicTitle); 
     TextView subtitle = (TextView) vi.findViewById(R.id.noPicSubtitle); 
     TextView id = (TextView) vi.findViewById(R.id.noPicID); 

     title.setText(data.get(position).getTitle().toString()); 
     subtitle.setText(data.get(position).getDate().toString()); 
     id.setText(data.get(position).getDescription()); 

     return vi; 
    } 
} 

код DOMFeedParser построен в соответствии с IBM open source Java XML parser article.

спасибо куча ...

+0

Как насчет 'result.size()' in onPostExecute? –

+0

может быть из-за того, что количество списков равно 0 .. i означает, что данные пустые. – ngesh

+0

сделайте свой ** результат ** содержит данные в ** onPostExecute **? – waqaslam

ответ

3

вы должны переопределить (в пользовательском адаптере)

getCount() 

и возвращает размер data для того, чтобы позволить adpater работы. Или вызвать конструктор, который принимает ArrayAdapter data

public ArrayAdapter (Context context, int textViewResourceId, T[] objects) 
+0

ну, я перепробовал функцию, и теперь вызывается 'getView()' IS. но отображаемое представление - это не полный список, а list_item. Итак, я изменил вызов конструктора из 'adapter2 = new NoPicAdapterV2 (NoPicList.this, R.layout.no_pic_list_item, result);' to 'R.layout.no_pic_list', который, конечно же, является списком, а не элементом списка, однако ничего еще не произошло ... – thepoosh

+0

В списке будет указано, что число записей равно data.size(). Я не понимаю, что вы имеете в виду в своем комментарии – Blackbelt

+0

Проще всего дать супер массив. нет смысла хранить локальную ссылку на массив в массиве, так как супер уже делает это – njzk2

0

Ваш ArrayAdapter не знает содержание вашего массива, и, следовательно, счетчик равен 0.

Используйте этот супер конструктор вместо: http://developer.android.com/reference/android/widget/ArrayAdapter.html#ArrayAdapter%28android.content.Context,%20int,%20java.util.List%3CT%3E%29

Как это:

public NoPicAdapterV2(Context context, int textViewResourceId, 
    ArrayList<Message> result) { 
    // Here 
    super(context, textViewResourceId, result); 
    data = (ArrayList<Message>) result; 
    mActivity = (Activity) context; 
    inflator = (LayoutInflater) mActivity 
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 
0

Надеюсь, что ниже код будет работать, просто добавьте еще один аргумент в супер (...)

public NoPicAdapterV2(Context context, int textViewResourceId, 
     ArrayList<Message> result) { 
     super(context, textViewResourceId,result); 
     data = (ArrayList<Message>) result; 
     mActivity = (Activity) context; 
     inflator = (LayoutInflater) mActivity 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
}