简体   繁体   中英

ListView with section headers repeats items when scrolling

I have finally had some luck getting section headers to appear by creating a switch block in my getView(). In doing so I have created a problem with my adapter because now my ListView repeats the top items over and over again. I have found other people with a similar problems, but they were solved by adding convertView.setTag(holder); I already have this, so I believe my problem is something with the way I have set up my switch block. Maybe a syntax problem that is causing things not to line up correctly.

Any help would be appreciated. Here is my adapter:

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;

}

}

This turned out to be a pretty simple mistake. I had to move the code that populates my views down below the else clause. This way if convert view is not null, it can still gettag() and populate the data.

@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;

}

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM