多个ListView在一个活动

时间:2017-05-03 13:22:37

标签: android class listview adapter

我一直试图根据某些类别显示跑步者的跑步历史,例如15秒的所有跑步都会在一个列表视图下进行,同样所有20秒的跑步都会在另一个列表显示。在每个列表视图的顶部有一个framelayout,其中包含时间标题和在此下的总运行次数。因此,如果我们在15秒标题下进行了2次运行,那么将会有一个带有这两个标题的framelayout,并且在它下面会有一个包含两个运行项的listview。 由于我从数据库中获取运行历史记录,因此我通过编码动态创建framelayouts和listviews。

我面临的问题是,当我在同一个活动中创建多个listview(通过代码或通过xml)并使用相同的适配器类(但是它的多个实例)时,这些列表视图列表视图将填充给最后一个适配器对象的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;
}

感谢任何帮助。

由于

1 个答案:

答案 0 :(得分:0)

适配器中的列表是静态的,因此对于类的所有实例都是相同的。

public static List<Run> list = null;替换为public List<Run> list = null;

我还建议你将它设为私有而不是公共(如果你需要从课外访问它,则创建一个getter)。