Android 带节标题的ListView在滚动时重复项目

Android 带节标题的ListView在滚动时重复项目,android,listview,Android,Listview,通过在getView()中创建一个开关块,我终于有幸显示了部分标题。在这样做的过程中,我的适配器产生了一个问题,因为现在我的ListView一次又一次地重复上面的项目。我发现其他人也有类似的问题,但通过添加convertView.setTag(holder)解决了这些问题;我已经有了这个,所以我相信我的问题在于我设置开关块的方式。可能是语法问题导致事情不能正确排列 任何帮助都将不胜感激。这是我的适配器: public class PlayerAdapter extends BaseAdapter

通过在getView()中创建一个开关块,我终于有幸显示了部分标题。在这样做的过程中,我的适配器产生了一个问题,因为现在我的ListView一次又一次地重复上面的项目。我发现其他人也有类似的问题,但通过添加convertView.setTag(holder)解决了这些问题;我已经有了这个,所以我相信我的问题在于我设置开关块的方式。可能是语法问题导致事情不能正确排列

任何帮助都将不胜感激。这是我的适配器:

public class PlayerAdapter extends BaseAdapter {

private Context mContext;

private static final int TYPE_ITEM = 0;
private static final int TYPE_SEPARATOR = 1;


private ArrayList<Player> mPlayers = new ArrayList<>();
private TreeSet<Integer> sectionHeader = new TreeSet<>();


public PlayerAdapter(Context context, ArrayList<Player> players) {
    mContext = context;
    mPlayers = players;
}

public void addItem(final Player player) {
    mPlayers.add(player);
    notifyDataSetChanged();
}

public void addSectionHeaderItem(final Player player) {
    mPlayers.add(player);
    sectionHeader.add(mPlayers.size() -1);
    notifyDataSetChanged();
}

@Override
public int getItemViewType(int position) {
    return sectionHeader.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM;
}

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

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

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

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

@Override
public boolean isEnabled(int position) {
    int rowType = getItemViewType(position);
    if(rowType == TYPE_SEPARATOR) {
        return false;
    }
    return true;
}



@Override
public View getView(int position, View convertView, ViewGroup parent) {
     ViewHolder holder =  new ViewHolder();

    int rowType = getItemViewType(position);

    if (convertView == null) {
        Player player = mPlayers.get(position);
        switch (rowType){
            case TYPE_ITEM:
                convertView = LayoutInflater.from(mContext).inflate(R.layout.player_list_item_layout, null);
                holder.playerNameTextView = (TextView) convertView.findViewById(R.id.playerNameTextView);
                holder.playerValueTextView = (TextView) convertView.findViewById(R.id.playerValueTextView);
                holder.remainingCapTextView = (TextView) convertView.findViewById(R.id.remainingCapTextView);
                holder.username = (TextView) convertView.findViewById(R.id.opponentUsername);
                holder.status = (TextView) convertView.findViewById(R.id.statusTextView);
                holder.vsTeamAbbrev = (TextView) convertView.findViewById(R.id.vsTeam);
                holder.resultsTextView = (TextView) convertView.findViewById(R.id.resultsTextView);


                DecimalFormat formatter = new DecimalFormat("$#,###");
                holder.playerNameTextView.setText(player.getName());
                holder.playerValueTextView.setText(formatter.format(Double.parseDouble(player.getValue())));
                holder.remainingCapTextView.setText(formatter.format(Double.parseDouble(player.getCap())));
                holder.username.setText(player.getUsername());
                holder.status.setText(player.getStatus());
                holder.vsTeamAbbrev.setText(player.getVsTeamAbbrev());
                holder.resultsTextView.setText(player.getResultsTextView());

                if (player.isMatchMade()) {
                    holder.status.setVisibility(View.VISIBLE);
                }
                convertView.setTag(holder);

                break;
            case TYPE_SEPARATOR:
                convertView = LayoutInflater.from(mContext).inflate(R.layout.player_section_header, null);
                holder.playerNameTextView = (TextView) convertView.findViewById(R.id.lastPlayer);
                holder.lastPlayerDate = (TextView) convertView.findViewById(R.id.lastPlayerDate);

                holder.playerNameTextView.setText(player.getName());
                holder.lastPlayerDate.setText(player.getLastPlayerDate());
                convertView.setTag(holder);
                break;

        }


    } else {




        holder = (ViewHolder) convertView.getTag();
    }




    return convertView;
}

private static class ViewHolder {

    //item views
    TextView playerValueTextView;
    TextView playerNameTextView;
    TextView remainingCapTextView;
    TextView username;
    TextView status;
    TextView vsTeamAbbrev;
    TextView resultsTextView;

    //section header views

    TextView lastPlayer;
    TextView lastPlayerDate;

}
公共类PlayerAdapter扩展BaseAdapter{
私有上下文;
私有静态最终整数类型\u项=0;
私有静态final int TYPE_SEPARATOR=1;
private ArrayList mPlayers=new ArrayList();
私有树集sectionHeader=新树集();
公共玩家适配器(上下文、ArrayList玩家){
mContext=上下文;
球员=球员;
}
公共无效附加项(最终玩家){
mPlayers.add(播放器);
notifyDataSetChanged();
}
公共无效添加分区头项(最终玩家){
mPlayers.add(播放器);
sectionHeader.add(mPlayers.size()-1);
notifyDataSetChanged();
}
@凌驾
public int getItemViewType(int位置){
返回段标题。包含(位置)?类型分隔符:类型项目;
}
@凌驾
public int getViewTypeCount(){
返回2;
}
@凌驾
public int getCount(){
返回mPlayers.size();
}
@凌驾
公共对象getItem(int位置){
返回mPlayers.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
公共布尔值isEnabled(整型位置){
int rowType=getItemViewType(位置);
if(rowType==类型\分隔符){
返回false;
}
返回true;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ViewHolder=新的ViewHolder();
int rowType=getItemViewType(位置);
if(convertView==null){
Player=mPlayers.get(位置);
开关(行类型){
案例类型\u项目:
convertView=LayoutInflater.from(mContext).充气(R.layout.player\u list\u item\u layou,null);
holder.playerNameExtView=(TextView)convertView.findViewById(R.id.playerNameExtView);
holder.playerValueTextView=(TextView)convertView.findViewById(R.id.playerValueTextView);
holder.remainingCapTextView=(TextView)convertView.findViewById(R.id.remainingCapTextView);
holder.username=(TextView)convertView.findViewById(R.id.opponentUsername);
holder.status=(TextView)convertView.findViewById(R.id.statusTextView);
holder.vsTeamAbbrev=(TextView)convertView.findViewById(R.id.vsTeam);
holder.resultsTextView=(TextView)convertView.findViewById(R.id.resultsTextView);
DecimalFormat formatter=新的DecimalFormat(“$#,##,##”);
holder.playerNameTextView.setText(player.getName());
holder.playerValueTextView.setText(formatter.format(Double.parseDouble(player.getValue()));
holder.remainingCapTextView.setText(formatter.format(Double.parseDouble(player.getCap()));
holder.username.setText(player.getUsername());
holder.status.setText(player.getStatus());
holder.vsteamabrev.setText(player.getvsteamabrev());
holder.resultsTextView.setText(player.getResultsTextView());
if(player.isMatchMake()){
holder.status.setVisibility(视图可见);
}
convertView.setTag(支架);
打破
箱型分离器:
convertView=LayoutFlater.from(mContext).充气(R.layout.player\u section\u header,空);
holder.playerNameTextView=(TextView)convertView.findViewById(R.id.lastPlayer);
holder.lastPlayerDate=(TextView)convertView.findViewById(R.id.lastPlayerDate);
holder.playerNameTextView.setText(player.getName());
holder.lastPlayerDate.setText(player.getLastPlayerDate());
convertView.setTag(支架);
打破
}
}否则{
holder=(ViewHolder)convertView.getTag();
}
返回视图;
}
私有静态类视图持有者{
//项目视图
TextView播放值TextView;
文本视图播放器或文本视图;
text视图保留captextview;
文本视图用户名;
文本视图状态;
TextView vsTeamAbbrev;
TextView结果TextView;
//节标题视图
文本视图播放器;
TextView lastPlayerDate;
}

}

这是一个非常简单的错误。我不得不将填充我视图的代码移到else子句下面。这样,如果convert视图不为null,它仍然可以gettag()并填充数据

@Override
public View getView(int position, View convertView, ViewGroup parent) {
     ViewHolder holder =  new ViewHolder();

    Player player = mPlayers.get(position);

    int rowType = getItemViewType(position);

    if (convertView == null) {

        switch (rowType){
            case TYPE_ITEM:
                convertView = LayoutInflater.from(mContext).inflate(R.layout.player_list_item_layout, null);
                holder.playerNameTextView = (TextView) convertView.findViewById(R.id.playerNameTextView);
                holder.playerValueTextView = (TextView) convertView.findViewById(R.id.playerValueTextView);
                holder.remainingCapTextView = (TextView) convertView.findViewById(R.id.remainingCapTextView);
                holder.username = (TextView) convertView.findViewById(R.id.opponentUsername);
                holder.status = (TextView) convertView.findViewById(R.id.statusTextView);
                holder.vsTeamAbbrev = (TextView) convertView.findViewById(R.id.vsTeam);
                holder.resultsTextView = (TextView) convertView.findViewById(R.id.resultsTextView);
                convertView.setTag(holder);

                break;
            case TYPE_SEPARATOR:
                convertView = LayoutInflater.from(mContext).inflate(R.layout.player_section_header, null);
                holder.playerNameTextView = (TextView) convertView.findViewById(R.id.lastPlayer);
                holder.lastPlayerDate = (TextView) convertView.findViewById(R.id.lastPlayerDate);

                convertView.setTag(holder);
                break;

        }

        //convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    switch (rowType){
        case TYPE_ITEM:
            DecimalFormat formatter = new DecimalFormat("$#,###");
            holder.playerNameTextView.setText(player.getName());
            holder.playerValueTextView.setText(formatter.format(Double.parseDouble(player.getValue())));
            holder.remainingCapTextView.setText(formatter.format(Double.parseDouble(player.getCap())));
            holder.username.setText(player.getUsername());
            holder.status.setText(player.getStatus());
            holder.vsTeamAbbrev.setText(player.getVsTeamAbbrev());
            holder.resultsTextView.setText(player.getResultsTextView());

            if (player.isMatchMade()) {
                holder.status.setVisibility(View.VISIBLE);
            }

            break;
        case TYPE_SEPARATOR:

            holder.playerNameTextView.setText(player.getName());
            holder.lastPlayerDate.setText(player.getLastPlayerDate());

            break;

    }




    return convertView;
}

private static class ViewHolder {

    //item views
    TextView playerValueTextView;
    TextView playerNameTextView;
    TextView remainingCapTextView;
    TextView username;
    TextView status;
    TextView vsTeamAbbrev;
    TextView resultsTextView;

    //section header views

    TextView lastPlayer;
    TextView lastPlayerDate;

}

}

列表中是否有多个标题?也许您在填充列表时添加了额外的标题。这是一个好主意,有趣的是,即使我注释掉创建标题的块,列表视图仍然会重复项目。另外,我的IDE说我的else块中的holder变量从未使用过。我不知道这是否是个问题。