Как обновить представление в методе getView ArrayAdapter? - PullRequest
1 голос
/ 25 ноября 2011

У меня следующая проблема.У меня есть ListView, и я использую специальный адаптер, расширяющий класс ArrayAdapter.В каждом ряду есть след. Button, когда я нажимаю на него, мне нужно изменить его стиль.

Пока у меня есть:

public View getView(final int position, View convertView, ViewGroup parent) {
        View vi = convertView;

        if (convertView == null) {  
            vi = inflater.inflate(R.layout.people_item, null);

            mViewHolder = new ViewHolder();              
            mViewHolder.follow = (Button) vi.findViewById(R.id.people_item_btn_follow);
            mViewHolder.name = (TextView)....
            vi.setTag(mViewHolder);         
        } else {
            mViewHolder = (ViewHolder) convertView.getTag();
        }

        mViewHolder.follow.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // Changing the style of the button
                if(mData[position].getFollow().equals("0")) {
                    mViewHolder.follow.setBackgroundDrawable(mCtx.getResources().getDrawable(R.drawable.unfollow_button_border));
                    mViewHolder.follow.setText(mCtx.getString(R.string.unfollow));
                } else {
                    mViewHolder.follow.setBackgroundDrawable(mCtx.getResources().getDrawable(R.drawable.follow_button_border));
                    mViewHolder.follow.setText(mCtx.getString(R.string.follow));
                }

                mSharedAsyncTasks.getFollowerTask().execute(mData[position].getId());
            }
        });

        if(mData[position] != null) {
            // Setting data
        }

        return vi;
    }

private static class ViewHolder {
    TextView fullName;
    Button follow;
}

Проблема в том, что при нажатии накнопка любой строки, новый стиль применяется к кнопке другой строки (хотя к следующей строке применяется эффект следующего).

Я знаю, что это связано с тем, чторяд перерабатывают / повторно используют.

Но как на самом деле это решить?

Спасибо!

1 Ответ

1 голос
/ 25 ноября 2011

Не уверен, что вы хотите сделать следующее.

 public void onClick(View v) {
      mViewHolder.follow.setBackgroundDrawable(mCtx.getResources().getDrawable(R.drawable.unfollow_button_border));
      ...
 }

В частности, я думаю, что проблема в том, что вы ссылаетесь на mViewHolder, который выглядит как зависший и может указывать на любую кнопку во время прокрутки. Это проблема, которую вы должны решить с помощью следующего. в onClick (View v) v я считаю, что вы нажали кнопку.

Вместо этого вы должны быть в состоянии сделать следующее

 public void onClick(View v) {
      ((Button)v).setBackgroundDrawable(mCtx.getResources().getDrawable(R.drawable.unfollow_button_border));
      ...
 }
...