Проблема с ListView. Когда я изменяю цвет элемента (нажимая на него) и прокручиваю, появляется другой элемент с измененным цветом - PullRequest
0 голосов
/ 04 августа 2011

У меня очень странная проблема с моим пользовательским списком.

В этом окне просмотра отображается множество имен и некоторые другие данные, и у каждого элемента есть прослушиватель onClick, и когда я нажимаю на один элемент, этот элемент получает цвет фона, измененный на КРАСНЫЙ. (arg1.setBackgroundColor(Color.RED);)

Но что-то не работает должным образом, потому что, если я прокручиваю представление списка, рядом с нижней частью списка появляется другой элемент.

это мой код:

public class StartingSquad extends Activity {

public static List<Player> Players = new ArrayList<Player>();
public int selectedPosition=-1;
ListView l1;
private TextView TeamPowerValue=null;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    MyApplication.updateStartingSquadOnPlayers(MyApplication.getPlayerTeam(),this);//actualizo los titulares

    Players=MyApplication.getPlayerTeam().getPlayers();

    setContentView(R.layout.startingsquad);
    TeamPowerValue = (TextView) findViewById(R.id.TeamPowerValue);
    l1 = (ListView) findViewById(R.id.ListView01);
    l1.setAdapter(new EfficientAdapter(this));

    TeamPowerValue.setText(""+MyApplication.getPlayerTeam().getPower());


    l1.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
            //Toast.makeText(getBaseContext(), "You clciked "+Players.get(arg2).getName(), Toast.LENGTH_SHORT).show();
            if (selectedPosition==-1) //si no hay ningun item seleccionado ya
            {
                arg1.setSelected(true);
                //arg1.setBackgroundResource(R.drawable.bg3);
                arg1.setBackgroundColor(Color.RED);

                selectedPosition=arg2;
            }
            else //si ya habiamos seleccionado un jugador
            {
                MyApplication.getPlayerTeam().changePlayerPositions(selectedPosition, arg2);
                selectedPosition=-1;
                MyApplication.updateStartingSquadOnPlayers(MyApplication.getPlayerTeam(),StartingSquad.this);//actualizo los titulares
                MyApplication.getPlayerTeam().calculatePower();
                TeamPowerValue.setText(""+MyApplication.getPlayerTeam().getPower());
                l1.setAdapter(new EfficientAdapter(StartingSquad.this));
            }
        }
    });
}

private static class EfficientAdapter extends BaseAdapter {

    private LayoutInflater mInflater;

    public EfficientAdapter(Context context) {
        mInflater = LayoutInflater.from(context);
    }

    public int getCount() {
        return Players.size();
    }

    public Object getItem(int position) {
        return position;
    }

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


    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.startingsquadlistview, null);
            holder = new ViewHolder();
            holder.text = (TextView) convertView.findViewById(R.id.PlayerPosition);
            holder.text2 = (TextView) convertView.findViewById(R.id.PlayerName);
            holder.text3 = (TextView) convertView.findViewById(R.id.PlayerPower);
            holder.text4 = (TextView) convertView.findViewById(R.id.PlayerStartingSquad);

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

        holder.text.setText(Players.get(position).getPosition());
        holder.text2.setText(Players.get(position).getName());
        holder.text2.setTextColor(Players.get(position).NameColor);
        holder.text3.setText(""+Players.get(position).getPower());
        holder.text4.setText("XX");

        return convertView;
    }

    static class ViewHolder {
        TextView text;
        TextView text2;
        TextView text3;
        TextView text4;
    }
}

}

Ответы [ 2 ]

1 голос
/ 04 августа 2011

Менять фон не в onItemSelected, а в adater getView ().

if(position == selectedPosition) {
    convertView.setBackgroundColor(context.getResources().getColor(R.color.red));
} else {
    convertView.setBackgroundColor(context.getResources().getColor(R.color.default));
}
0 голосов
/ 04 августа 2011

Попробуйте удалить эту строку:

l1.setAdapter(new EfficientAdapter(StartingSquad.this));

Если вы не можете, скажите мне, почему?


Еще одна вещь: Редактируйте эту функцию:

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        View convertViews;
        if (convertView == null) {
            convertViews = mInflater.inflate(R.layout.startingsquadlistview, null);
            holder = new ViewHolder();
            holder.text = (TextView) convertView.findViewById(R.id.PlayerPosition);
            holder.text2 = (TextView) convertView.findViewById(R.id.PlayerName);
            holder.text3 = (TextView) convertView.findViewById(R.id.PlayerPower);
            holder.text4 = (TextView) convertView.findViewById(R.id.PlayerStartingSquad);

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

        holder.text.setText(Players.get(position).getPosition());
        holder.text2.setText(Players.get(position).getName());
        holder.text2.setTextColor(Players.get(position).NameColor);
        holder.text3.setText(""+Players.get(position).getPower());
        holder.text4.setText("XX");

        return convertViews;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...