リストにカスタムアダプタを設定しているフラグメントのコードを次に示します。
エラーはありませんが、ListView
は空です。 ArrayListに正しい数のアイテムを返すgetCount()
を実装しました。 logcatに("Inside", "GetView")
が表示されない
フラグメント
public class ServiceCarListFragment extends Fragment {
private String url;
private ArrayList<CarDetail> carDetailList = new ArrayList<CarDetail>();
private CarListAdapter adapter;
private ListView mList;
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
url = getActivity().getIntent().getStringExtra("url");
new DownloadCarDetail().execute(url);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View v = inflater.inflate(R.layout.fragment_service_car_list, container, false);
mList = (ListView) v.findViewById(R.id.list);
mList.setAdapter(adapter);
for (CarDetail car : carDetailList) {
// START LOADING IMAGES FOR EACH STUDENT
car.loadImage(adapter);
}
return v;
}
class DownloadCarDetail extends AsyncTask<String, String, ArrayList<CarDetail>> {
@Override
protected ArrayList<CarDetail> doInBackground(String... params) {
// TODO Auto-generated method stub
ArrayList<CarDetail> carDetailList = JsonParser.parseJson(params[0]);
return carDetailList;
}
@Override
protected void onPostExecute(ArrayList<CarDetail> carDetailList) {
// TODO Auto-generated method stub
ServiceCarListFragment.this.carDetailList = carDetailList;
Log.d("dccs", String.valueOf(ServiceCarListFragment.this.carDetailList.size()));
adapter = new CarListAdapter(getActivity(), ServiceCarListFragment.this.carDetailList);
Log.d("dccs", String.valueOf((adapter.getCount())));
}
}
}
CustomAdapter
public class CarListAdapter extends BaseAdapter {
private ArrayList<CarDetail> items = new ArrayList<CarDetail>();
private Context context;
public CarListAdapter(Context context, ArrayList<CarDetail> items) {
this.context = context;
this.items = items;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return items.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return items.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Log.d("Inside", "GetView");
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
ViewHolder holder = null;
CarDetail car = items.get(position);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.car_list_row, null);
holder = new ViewHolder();
holder.tvCarName = (TextView) convertView.findViewById(R.id.tvCarName);
holder.tvDailyPriceValue = (TextView) convertView.findViewById(R.id.tvWeeklyPriceValue);
holder.tvWeeklyPriceValue = (TextView) convertView.findViewById(R.id.tvWeeklyPriceValue);
holder.imgCar = (ImageView) convertView.findViewById(R.id.imgCar);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tvCarName.setText(car.getCarName());
if (car.getImage() != null) {
holder.imgCar.setImageBitmap(car.getImage());
} else {
// MY DEFAULT IMAGE
holder.imgCar.setImageResource(R.drawable.ic_action_call);
}
return convertView;
}
static class ViewHolder {
TextView tvCarName;
TextView tvDailyPriceValue;
TextView tvWeeklyPriceValue;
ImageView imgCar;
}
}
getView
が呼び出されない唯一の理由は次のとおりです。
getCount
は0を返します。setAdapter
でListView
を呼び出すのを忘れています。ListView
の可視性(またはそのコンテナの可視性)がGONE
の場合。貴重な情報を提供してくれた@TaynãBonaldoに感謝します。ListView
はどのビューポートレイアウトにもアタッチされていません。つまり、mListView = new ListView(...)
なしでmyLayout.addView(mListView)
が使用されます。onPostExcute
で、CarListAdapter
の新しいインスタンスを作成した後、ListView
に新しいインスタンスを更新することをお勧めします。本当にあなたはもう一度電話する必要があります
mList.setAdapter(adapter);
編集:予期しない動作を避けるために、setAdapter
は常にUIスレッドで呼び出す必要があります
Edit2:
同じことがRecyclerView
にも当てはまります。確認してください
getItemCount
は0
(通常はデータセットサイズ)よりも大きい値を返していますsetLayoutManager
とsetAdapter
の両方をUI Thread
で呼び出す必要がありますVISIBLE
に設定する必要がありますリストにアイテムを追加するときに、リストに要素があることを確認する必要があります。を確認するには、次のメソッドを使用します:
adapter.getCount();
同様の問題に直面しました。これを解決する簡単な回避策を次に示します。
OnCreateViewでは、ビューが作成されるまで待つ必要があります。したがって、これから行を変更します。
mList = (ListView)v.findViewById(R.id.list);
mList.setAdapter(adapter);
上記の2行を変更:
mList = (ListView)v.findViewById(R.id.list);
mList.post(new Runnable() {
public void run() {
mList.setAdapter(adapter);
}
});
これが同様の問題に遭遇する他の人を助けることを願っています
同じ問題がありました。また、上記のすべてのヒントを試しても、getViewが呼び出されていませんでした。そこで、ListViewの外部で使用したScrollViewを削除しようとしました。その後、getViewはうまく機能しました。可能性をもう1つ追加します。私は誰かを助けることを願っています。
あなたがやっていることは
あなたのアダプターで
public CarListAdapter(Context context , ArrayList<CarDetail> items) {
this.context = context;
this.items = items;
}
あなたのフラグメントに
adapter = new CarListAdapter(getActivity(),ServiceCarListFragment.this.carDetailList);
FragmentActivity
を使用することを願っています
電話する必要があります
adapter = new CarListAdapter(YOUR_ACTIVITY_CONTEXT, carDetailList);
ここで、YOUR_ACTIVITY_CONTEXT
はあなたのFragmentActivity
になります
コンストラクターにスーパークラスがありません。以下の例を参照してください。
public AppDataAdapter(Activity a, int textViewResourceId, ArrayList<AppData> entries) {
super(a, textViewResourceId, entries);
this.entries = entries;
this.activity = a;
}