0

asynctask によって設定されたカスタム リスト ビュー アダプターがあり、onprogress 関数で notifydatasetchanged を呼び出しています。getCount() は 10 を返しますが、リストが表示されません。何か案は?私は何時間も試しましたが、ただ困惑しました。ビューホルダーを使用したことを除いて、別のアクティビティでまったく同じことを行いました。これはテキストベースのデータのみを保持するため、気にしませんでした。

アダプタ:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
  View row = convertView;
  if(row == null) {
    row = inflater.inflate(R.layout.podcastepisode, null);
  }
  PodcastItem item = items.get(position);
  TextView episodeTitle = (TextView)row.findViewById(R.id.episodeTitle);
  TextView episodeDate = (TextView)row.findViewById(R.id.episodeDate);
  episodeTitle.setText(item.title);
  episodeDate.setText(API.FormatPodcastDate(item.date));
  return row;
}

私の仕事:

protected void onProgressUpdate(PodcastItem... progress) {
  AddPodcastActivity.episodes.add(progress[0]);
  AddPodcastActivity.adapter.notifyDataSetChanged();
}
4

1 に答える 1

1

リスト アダプターを Activity ファイル内から独自のファイルに移動し、次のようなものを使用することをお勧めします。

import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

public class EpisodeArrayAdapter extends BaseAdapter {

    public EpisodeArrayAdapter(Context context) {
        mContext = context;
        items = new ArrayList<PodcastItem>();
    }

    private Context mContext;
    private ArrayList<PodcastItem> items;

    public void add(PodcastItem item) {
        items.add(item);
        notifyDataSetChanged();
    }

    public void remove(int index) {
        items.remove(index);
        notifyDataSetChanged();
    }

    public void clear() {
        items.clear();
        notifyDataSetChanged();
    }

    @Override
    public int getCount() { return items.size(); }

    @Override
    public Object getItem(int position) { return items.get(position); }

    @Override
    public long getItemId(int position) { return position; }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        if(row == null) row = LayoutInflater.from(mContext).inflate(R.layout.podcastepisode, null);
        PodcastItem item = items.get(position);
        TextView episodeTitle = (TextView)row.findViewById(R.id.episodeTitle);
        TextView episodeDate = (TextView)row.findViewById(R.id.episodeDate);
        episodeTitle.setText(item.title);
        episodeDate.setText(API.FormatPodcastDate(item.date));
        return row;
    }
}

これは、Boid のすべてのリスト アダプターに使用するコードのタイプです :) また、追加/削除/クリア関数が notifyDataSetChanged() を呼び出すことに注意してください。これにより、アイテムを追加するときに自分で呼び出す必要がなくなります。

初期化するときは、次を使用します。

EpisodeArrayAdapter adapter = new EpisodeArrayAdapter(this);
listView.setAdapter(adapter);

add() 関数でアイテムを追加すると、リストがすぐに更新されます。アダプターを使用しているリスト ビューに対して必ず setAdapter を呼び出してください。そうしないと、接続が確立されず、リストに何も表示されません (コードでこれへの呼び出しが表示されませんでした)。

于 2012-07-07T02:20:39.183 に答える