ListView со специализированными кнопками внутри адаптера

Это пользовательский класс

public class TextWithButton{
protected String playerName;

public TextWithButton(String playerName){
    this.playerName=playerName;
}

И это пользовательский адаптер

public class TextWithButtonAdapter extends ArrayAdapter<TextWithButton>{
Context context;
int layoutResourceId;
ArrayList<TextWithButton> data = null;
boolean isAddable;

public TextWithButtonAdapter(Context context, int layoutResourceId, ArrayList<TextWithButton> data, boolean isAddable) {
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = data;
    this.isAddable = isAddable;
}

@Override
public void add(TextWithButton object)
{
    super.add(object);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    TextWithButtonHolder holder = null;

    if(row == null)
    {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);

        holder = new TextWithButtonHolder();
        holder.playerNameText = (TextView)row.findViewById(R.id.player_name);
        holder.processPlayerFab = (FloatingActionButton)row.findViewById(R.id.process_player);

        row.setTag(holder);
    }
    else
    {
        holder = (TextWithButtonHolder)row.getTag();
    }

    TextWithButton textWithButton = data.get(position);
    holder.playerNameText.setText(textWithButton.playerName);
    if(isAddable)
    {
        holder.processPlayerFab.setImageResource(android.R.drawable.ic_menu_add);
        holder.processPlayerFab.setBackgroundColor(context.getResources().getColor(android.R.color.holo_green_light));
    }
    else
    {
        holder.processPlayerFab.setImageResource(android.R.drawable.ic_menu_delete);
        holder.processPlayerFab.setBackgroundColor(context.getResources().getColor(android.R.color.holo_red_light));
    }

    return row;
}

static class TextWithButtonHolder
{
    TextView playerNameText;
    FloatingActionButton processPlayerFab;
}

Я пытаюсь установить OnClickListener для этого FloatingActionButton снаружи адаптера, так как есть несколько функций, которые я хочу реализовать для него. Например, я хочу иметь два адаптера в каком-то классе, в котором они вызывают две разные функции при нажатии на них. Я также хотел бы избежать setOnItemClickListener ListView.

1 ответ

Хорошо, если я понимаю, что вы в основном хотите получить доступ к кнопке плавающего действия из ее представления контейнера, чтобы установить onclicklistner специально для него.

Способом сделать это будет своего рода цикл for, проходящий, скажем, через некоторые числовые теги, которые вы помещаете в плавающую кнопку действия. Такие как

floatingbutton.setTag("tag" + position);

и затем доступ к кнопке где-нибудь потенциально в цикле for, проходящем по списку, добавляя определенные эффекты onclick в его контейнерный класс.

(FloatingActionButton) listview.findViewWithTag("tag" + (int));

это позволит вам добавить onclicklisteners к плавающей кнопке действия из ее класса контейнера.

Если, конечно, я не понял вопрос.

Другие вопросы по тегам