【发布时间】:2017-05-03 13:22:36
【问题描述】:
我一直在尝试根据某些类别显示跑步者的跑步历史记录,例如所有时间为 15 秒的跑步都将归入一个列表视图,类似地,所有时间为 20 秒的跑步都将归入另一个列表视图列表显示。在每个列表视图的顶部都有一个框架布局,其中包含时间标题和该标题下的总运行次数。因此,如果我们在 15 秒标题下有 2 次运行,那么将有一个带有这两个标题的框架布局,并且在它下面会有一个包含两个运行项的列表视图。 由于我从数据库中获取运行历史记录,因此我正在通过编码动态创建框架布局和列表视图。
我面临的问题是,当我在同一个活动中创建多个列表视图(通过代码或通过 xml)并为这些列表视图使用相同的适配器类(但不止一个实例)时,然后所有listviews 被赋予给最后一个适配器对象的 arraylist 填充。请考虑以下代码以获得更清晰的信息:
for(int i=0; i<listOfLists.size(); i++) {
linearLayout.addView(frameLayoutList.get(i));
CustomAdapter2 customAdapter2 = new
CustomAdapter2(getBaseContext(), listOfLists.get(i));
ListView listView = new ListView(getApplicationContext());
listView.setAdapter(customAdapter2);
linearLayout.addView(listView);
}
我尝试为具有不同类名 (customAdapter3) 的适配器创建完全相同的新类,并使用 customAdapter2 和 customAdapter3 填充了两个列表视图,它们正在使用正确的数据填充列表视图。 由于我事先不知道将使用多少个列表视图,因此我无法为所有列表视图创建不同的适配器类。 是否有可能对所有列表视图使用相同的适配器类,而每个列表视图具有不同的实例?
这是适配器类的代码
public class CustomAdapter2 extends BaseAdapter {
private final LayoutInflater mInflater;
Context context;
public static List<Run> list = null;
public CustomAdapter2(Context context, List<Run> l) {
this.context = context;
this.list = l;
mInflater = LayoutInflater.from(context);
}
public void add(Run run) {
list.add(run);
notifyDataSetChanged();
}
public double getScreenSize() {
DisplayMetrics dm = new DisplayMetrics();
WindowManager windowManager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels;
int height = dm.heightPixels;
int dens = dm.densityDpi;
double wi = (double) width / (double) dens;
double hi = (double) height / (double) dens;
double x = Math.pow(wi, 2);
double y = Math.pow(hi, 2);
double screenInches = Math.sqrt(x + y);
return screenInches;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
if(getScreenSize() <= 4)
convertView = mInflater.inflate(R.layout.list_view_item_small, parent, false);
else
convertView = mInflater.inflate(R.layout.list_view_item, parent, false);
holder = new ViewHolder();
holder.trophyTextView = (TextView) convertView.findViewById(R.id.trophyTextView);
holder.normalTextView = (TextView) convertView.findViewById(R.id.normalTextView);
holder.raceDuration = (TextView) convertView.findViewById(R.id.raceTime1TextView);
holder.raceTimeUnit = (TextView) convertView.findViewById(R.id.raceTime2TextView);
holder.raceDate = (TextView) convertView.findViewById(R.id.dateTextView);
holder.raceTime = (TextView) convertView.findViewById(R.id.timeTextView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if(position == 0) {
holder.trophyTextView.setVisibility(View.VISIBLE);
holder.normalTextView.setVisibility(View.INVISIBLE);
}
else {
holder.trophyTextView.setVisibility(View.INVISIBLE);
holder.normalTextView.setVisibility(View.VISIBLE);
holder.normalTextView.setText("" + (position + 1));
}
holder.raceDuration.setText(list.get(position).getTimeDistance());
holder.raceTimeUnit.setText(list.get(position).getUnit());
holder.raceDate.setText(list.get(position).getDate());
holder.raceTime.setText(list.get(position).getTime());
return convertView;
}
private class ViewHolder {
TextView trophyTextView;
TextView normalTextView;
TextView raceDuration;
TextView raceTimeUnit;
TextView raceDate;
TextView raceTime;
}
感谢任何帮助。
谢谢
【问题讨论】:
标签: android class listview adapter