【问题标题】:Android ListView - ArrayList only 7 items from 23 used - why?Android ListView - ArrayList 仅使用了 23 个项目中的 7 个项目 - 为什么?
【发布时间】:2016-03-05 18:54:37
【问题描述】:

我编写了自己的 ListView BaseAdapter。我有一个包含 23 个条目的 ArrayList。前七个来自实例游戏,接下来的 16 个来自实例表。但是如果我运行 ListView 我只会得到前七个项目。如果我不重用 convertview (...if(convertview==null || true){...) 我每 23 个项目得到一次。不重复使用物品有问题吗?

package k0f.de.americanfootball;

import android.content.Context;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.ArrayList;

/**
 * Created by benjaminbecker on 26.02.16.
 */
public class AmericanFootballAdapter extends BaseAdapter {

    private final LayoutInflater inflator;
    private ArrayList<Object> arrayList = new ArrayList<Object>();

    public AmericanFootballAdapter(Context context) {
        inflator = LayoutInflater.from(context);
    }

    public void setNewDataGames(ArrayList<Object> arrayList){
        this.arrayList=arrayList;
    }

    @Override
    public int getViewTypeCount() {
        return 2;
    }

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

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        Context context = parent.getContext();

        // falls nötig, convertView bauen
        // Holder bereits vorhanden
        if (convertView == null) {

            // Layoutdatei entfalten
            if((position%2)==0){
                convertView = inflator.inflate(R.layout.listitem_game, parent,
                        false);
            }else{
                convertView = inflator.inflate(R.layout.listitem_table, parent,
                        false);
            }

            // Holder erzeugen
            holder = new ViewHolder();

            Object ob = getItem(position);

            if(ob instanceof AmericanFootballDataGames){
                holder = holderGames(holder, convertView, context, (AmericanFootballDataGames) ob);
                convertView.setTag(holder);
            }

            if(ob instanceof AmericanFootballDataTable){
                holder = holderTable(holder, convertView, context, (AmericanFootballDataTable) ob);
                convertView.setTag(holder);
            }

        } else  {
            Log.v("Ben","HolderGame");
            holder = (ViewHolder) convertView.getTag();
            convertView.setTag(holder);
        } /*else {
            Log.v("Ben","HolderTable");
            holderG = (ViewHolderGame) convertView.getTag();
            convertView.setTag(holderG);
        }
*/
        return convertView;
    }

    static class ViewHolder {
        TextView tv1, tv2, tv3;
    }

    private ViewHolder holderGames(ViewHolder holder, View convertView, Context context, AmericanFootballDataGames afdg){
        String erg = afdg.getTdheim() + " : " +
                afdg.getTdgast() + " (" +
                afdg.getQ1heim() + " : " +
                afdg.getQ1gast() + " , " +
                afdg.getQ2heim() + " : " +
                afdg.getQ2gast() + " , " +
                afdg.getQ3heim() + " : " +
                afdg.getQ3gast() + " , " +
                afdg.getQ4heim() + " : " +
                afdg.getQ4gast() + ")";

        holder.tv2 = (TextView) convertView.findViewById(R.id.game);
        holder.tv3 = (TextView) convertView.findViewById(R.id.erg);
        holder.tv1 = (TextView) convertView.findViewById(R.id.date);

        holder.tv1.setText(afdg.getAnstoss()+System.getProperty("line.separator")+afdg.getDatum());
        holder.tv2.setText(afdg.getHeim() + System.getProperty("line.separator") + afdg.getGast());
        holder.tv3.setText(erg);

        if(afdg.getTdheim().toString()=="?") {
            holder.tv3.setTextColor(ContextCompat.getColor(context, R.color.colorListHalfLight));
        }else{
            holder.tv3.setTextAppearance(context, android.R.style.TextAppearance_Medium);
            holder.tv3.setTextColor(ContextCompat.getColor(context, R.color.colorListHalfDark));
        }

        return holder;
    }

    private ViewHolder holderTable(ViewHolder holder, View convertView, Context context, AmericanFootballDataTable afdt){
        holder.tv2 = (TextView) convertView.findViewById(R.id.game);
        holder.tv3 = (TextView) convertView.findViewById(R.id.erg);
        holder.tv1 = (TextView) convertView.findViewById(R.id.date);
        holder.tv1.setText(Integer.toString(afdt.getPlatz()));
        holder.tv2.setText(afdt.getMannschaft());
        holder.tv3.setText(afdt.getPplus()+" "+afdt.getPminus());
        return holder;
    }
}

这是有和没有表格数据的屏幕。

【问题讨论】:

    标签: android listview arraylist


    【解决方案1】:

    您将覆盖 getViewTypeCount() 以返回 2,这表示此适配器可以处理两种不同类型的视图。如果这样做,您还必须覆盖 getItemViewType() 以返回一个 int 值,指示哪种类型的视图位于给定位置。然后,您需要在 getView() 中为该位置充气正确的视图,以便 ListView 可以正确地回收和重用该视图以用于该类型的其他项目。

    【讨论】:

    • 感谢您的回答。是的,试过了,忘记删除这些行。此外,如果没有此参数,则不会显示 ArrayList 中的所有对象。
    【解决方案2】:

    发现我的错误。在返回 convertView 之前必须在持有人上设置文本;而不是在 if 复数中。

    【讨论】:

      猜你喜欢
      • 2016-05-01
      • 2015-10-09
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      相关资源
      最近更新 更多