Как правильно работать с адаптером

269
14 марта 2017, 13:34

Существует адаптер, который создает вьюшку, заполняет её инфой из массива и отдает её. В каждой вьюшке есть 4 кнопки. Для всех вьюшек одинаковая разметка

Как мне по нажатию кнопки получать id элемента в массиве, который принадлежит конкретно этой view? Или может я не правильно понимаю принцип работы адаптера?

 // пункт списка
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // используем созданные, но не используемые view
    View view = convertView;
    if (view == null) {
        view = lInflater.inflate(R.layout.magazine_cell, parent, false);
    }
    Magazine magazine = getProduct(position);

    String viewsCount = String.valueOf(magazine.getViewsCount());
    String title = magazine.getTitle();
    String imageURL = magazine.getTitleImage();
    String preview = magazine.getPreview();
    viewTitle = (TextView) view.findViewById(R.id.title);
    viewTitle.setText(title);
    viewViewsCount = (TextView) view.findViewById(R.id.viewsCount);
    viewViewsCount.setText(viewsCount);
    viewPreview = (TextView) view.findViewById(R.id.preview);
    viewPreview.setText(preview);
    ImageView magazineImage =  (ImageView) view.findViewById(R.id.magazineImage);
    Picasso.with(context).load(imageURL).into(magazineImage);
    cell = (RelativeLayout) view.findViewById(R.id.cell);
    cell.setOnClickListener(viewsClickListener);
    buttons.add(downloadPDF = (Button) view.findViewById(R.id.downloadPDF));
    buttons.add(downloadText = (Button) view.findViewById(R.id.downloadText));
    buttons.add(readText = (Button) view.findViewById(R.id.readText));
    buttons.add(readPDF = (Button) view.findViewById(R.id.readPDF));
    createListenersForButton();
    setPreviewMode();
    setButtonsColors(magazine);
    return view;
}

 private View.OnClickListener viewsClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        int id = v.getId();
        if(id == R.id.downloadPDF){
            //TODO
        }else if(id == R.id.downloadText){
        }else if(id == R.id.readPDF){
        }else if(id == R.id.readText){
        }else if (id == R.id.cell){
            switchShowMode();
        }else if(id == R.id.preview){
            switchShowMode();
        }
    }
};
Answer 1

У меня в каждом элементе ListView есть 4 кнопки. Мне надо, чтобы при нажатии на кнопку в конкретном View, в нем же кое-что и менялось

     // пункт списка
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // используем созданные, но не используемые view
            View view = null;
            view = lInflater.inflate(R.layout.magazine_cell, parent, false);

            Button downloadPDF = (Button) view.findViewById(R.id.downloadPDF);
            downloadPDF.setOnclickListener(GetviewsClickListener(position,view));
            return view;
        }
private View.OnClickListener GetviewsClickListener(int pos,View view)
{
    if(pos==1)
       return new View.OnClickListener() {
       @Override
       public void onClick(View v) {
       LinearLayout l = (LinearLayout) view;
        l.setBackgroundColor(...);
        }
     if(pos==2)
    //....
}

Вот такой пример. При нажатии на кнопки в i-той позиции мы изменяем ТОЛЬКО view на i-той позиции. Т.е у меня 2 листенера на кнопки выше. При нажатии на первую сменится цвет фона ТОЛЬКО данного view в ListView. Если listener объемный, то может есть смысл вынести его в другое место или еще как-то поправить код для понятности и красоты, но суть не меняется. Надеюсь я ответил на вопрос. Если у кого есть идеи по "лучшей практики", я с удовольствием увидел бы другие варианты.

Сделал с вынесенным листенером. Понятно что условия любые можно делать. Моя функция(GetviewsClickListener) просто возвращает листенер. seOnClickListener нужен чтобы присвоить возвращаемый листенер.

READ ALSO
Как задать время активации Notification в Android

Как задать время активации Notification в Android

Имеется файл в котором сохранен список времени выполнения, при нажатии на кнопку происходит извлечение времени из файла

200
Бот для VK на Java

Бот для VK на Java

Не совсем сведущ в веб-программировании, поэтому попрошу не принимать близко к сердцу мои, возможно глупые, вопросы :)

502
Spring 4 mvc загрузка файла используя @ModelAtribute

Spring 4 mvc загрузка файла используя @ModelAtribute

ЗдравствуйтеИзучаю спринг, пытаюсь загрузить фото

414