2015-02-11 2 views
0

У меня есть приложение, которое показывает график для баскетбольной команды. В нем перечислены игры, которые они уже играли, а затем предстоящие игры. Я изменяю макет строки в зависимости от того, была ли игра воспроизведена. Например, если игра была сыграна, я показываю «W» или «L» в TextView, но если игра не была воспроизведена, я скрываю этот TextView.ListView view recycling messes up rows

Проблема в том, что когда я прокручиваю нижнюю часть, где все текстовые элементы скрыты, а затем прокручивается назад, все «L» и «W», с которых они должны начаться, являются теперь скрыто. Есть ли все-таки предотвратить это? Вот мой адаптер:

package com.example.sixerstrivia; 

import java.util.ArrayList; 

import android.content.Context; 
import android.graphics.Color; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.TextView; 

public class GameAdapter extends ArrayAdapter<Game> { 

    public GameAdapter(Context context, ArrayList<Game> games) { 
     super(context, R.layout.game_row, games); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     final Game game = getItem(position); 

     if (convertView == null) { 
      convertView = LayoutInflater.from(getContext()).inflate(
        R.layout.game_row, parent, false); 
     } 

     TextView tvTopTeam = (TextView) convertView 
       .findViewById(R.id.tvTopTeam); 
     TextView tvBottomTeam = (TextView) convertView 
       .findViewById(R.id.tvBottomTeam); 
     TextView tvTopScore = (TextView) convertView 
       .findViewById(R.id.tvTopScore); 
     TextView tvBottomScore = (TextView) convertView 
       .findViewById(R.id.tvBottomScore); 
     TextView tvAt = (TextView) convertView.findViewById(R.id.tvAt); 
     TextView tvVs = (TextView) convertView.findViewById(R.id.tvVs); 
     TextView tvWin = (TextView) convertView.findViewById(R.id.tvWin); 
     TextView tvDate = (TextView) convertView.findViewById(R.id.tvDate); 

     if (game.completed) { 
      tvDate.setText(game.gameDate); 
      if (game.win) { 
       tvWin.setText("W"); 
       tvWin.setTextColor(Color.GREEN); 
      } else { 
       tvWin.setText("L"); 
       tvWin.setTextColor(Color.RED); 
      } 
     } else { 
      tvDate.setText(game.gameDate + "\n" + game.gameTime + " PM"); 
      tvWin.setVisibility(View.GONE); 
      tvTopScore.setVisibility(View.INVISIBLE); 
      tvBottomScore.setVisibility(View.INVISIBLE); 
     } 

     if (!game.homeTeam.equals("PHI")) { 
      tvTopTeam.setText(game.awayTeam); 
      tvVs.setVisibility(View.GONE); 
      if (game.completed) { 
       tvAt.setVisibility(View.GONE); 
       tvTopScore.setText(game.awayScore); 
       tvBottomScore.setText(game.homeScore); 
      } 
      tvBottomTeam.setText(game.homeTeam); 
     } else { 
      tvTopTeam.setText(game.homeTeam); 
      tvAt.setVisibility(View.GONE); 
      if (game.completed) { 
       tvVs.setVisibility(View.GONE); 
       tvTopScore.setText(game.homeScore); 
       tvBottomScore.setText(game.awayScore); 
      } 
      tvBottomTeam.setText(game.awayTeam); 
     } 

     return convertView; 
    } 
} 
+0

используйте viewHolder. он может исправить вашу проблему. –

ответ

1

Вы их скрываете, но вы не делаете их видимыми снова. Поскольку listview повторно использует представления, они остаются скрытыми. Вызвать tvWin.setVisibility(View.VISIBLE);, если матч был сыгран. Также используйте просмотрщик для выполнения.

+0

Стоит просто перейти к RecyclerView просто потому, что он обеспечивает просмотр ViewHolders. –

+0

Ах, это может быть просто просто LOL Я попробую, спасибо – user1282637