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