【问题标题】:Multiple ListViews with multiple instances of the same custom adapter in one activity在一个活动中具有相同自定义适配器的多个实例的多个 ListView
【发布时间】: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


    【解决方案1】:

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

    public static List&lt;Run&gt; list = null; 替换为public List&lt;Run&gt; list = null;

    我还建议您将其设为私有而不是公开(如果您需要从课堂外访问它,请创建一个 getter)。

    【讨论】:

    • 谢谢,我快疯了。不敢相信我错过了静态部分。再次感谢伙计。
    猜你喜欢
    • 1970-01-01
    • 2015-10-08
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多