Присоединение ClickListener к элементу списка, нажатие кнопки в пользовательском адаптере - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть этот пользовательский адаптер

public class ProductAdapter extends ArrayAdapter<Product> {

Context mContext;

public ProductAdapter(Activity context, ArrayList<Product> products) {
    super(context, 0, products);
}

@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {

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

    Product currentProduct = getItem(position);

    TextView nameTextView = (TextView) listItemView.findViewById(R.id.product_name);

    nameTextView.setText(currentProduct.getProductName());

    TextView numberTextView = (TextView) listItemView.findViewById(R.id.product_price);

    numberTextView.setText("$"+currentProduct.getProductPrice());

    ImageView iconView = (ImageView) listItemView.findViewById(R.id.list_item_icon);

    iconView.setImageResource(currentProduct.getProductImage());

    Button buyNow = (Button) listItemView.findViewById(R.id.buy_now);

    buyNow.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(mContext,"test", Toast.LENGTH_SHORT).show();
        }
    });

    return listItemView;
  }
}

И эта кнопка в list_item

<Button
        android:id="@+id/buy_now"
        android:text="Buy Now"
        style="@style/listBtn" />

Как вы видите, я определил mContext в качестве контекста, чтобы использовать его внутри адаптера.

Нажатие на кнопку закрывает приложение и не работает.Как правильно создать onClickListener в пользовательском адаптере?

Ответы [ 4 ]

0 голосов
/ 07 декабря 2018

Вы можете сделать это тремя различными способами, как показано ниже.

Метод 1: Инициализировать ваш контекст в конструкторе, который вы можете создать, как показано ниже:

Context mContext;
List<Product> products

public ProductAdapter(Context mContext, List<Product> products) {
    super(context, 0, products);

    this.mContext = mContext;
    this.products = products;
}

И затем этоконтекст, который вы используете в своем коде.

Метод - 2: Создайте свой собственный слушатель в своем адаптере и используйте его, как показано ниже:

// Ваш интерфейс в адаптере

private onItemViewClickListener itemViewClickListener;

// Ваш пользовательский интерфейс определяет

public interface onItemViewClickListener{
       void onClick(View view, int position, Object object)
}

// Метод установки для вашего интерфейса

public void setItemViewClickListener(onItemViewClickListener itemViewClickListener) {
        this.itemViewClickListener = itemViewClickListener;
}

// Событие просмотра при просмотре, где вы должны установить значение, как показано ниже:

convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (itemViewClickListener != null){
                    itemViewClickListener.onClick(v, position, object);
                }
            }
        });

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

TestAdapter adapter = new TestAdapter();
adapter.setItemViewClickListener(new TestAdapter.onItemViewClickListener() {
    @Override
    public void onClick(View view, int position, Object object) {
                //Here your logic
    }
});

Или, если вы реализуете интерфейс адаптера в своем классе активности, вам придется использовать приведенный ниже код, и ваш метод щелчка будет переопределен после реализации в классе, где вы можете написать свою логику:

TestAdapter adapter = new TestAdapter();
adapter.setItemViewClickListener(this);
0 голосов
/ 03 декабря 2018

Когда вы выполняете событие щелчка в просмотре списка или в окне повторного просмотра, тогда создаете интерфейс в классе адаптера следующим образом.

    onItemClickListner onItemClickListner;

public void setOnItemClickListner(CommentsAdapter.onItemClickListner onItemClickListner) {
    this.onItemClickListner = onItemClickListner;
}

public interface onItemClickListner {
    void onClick(int position);//pass your object types.
}

после этого getView () в ..

        buyNow.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onItemClickListner.onClick(position); // pass your data.
        }
    });

после этого создайте объект адаптера и привяжите его в список после того, как это вызвало событие щелчка .. убедитесь, что ваш адаптер не нулевой

        adapter.setOnItemClickListner(new CommentsAdapter.onItemClickListner() {
        @Override
        public void onClick(int position) {
            // here show your toast or data
            adapter.notifyDataSetChanged();
        }
    });
0 голосов
/ 03 декабря 2018

Ваш mContext не инициализирован.

Вы можете получить контекст из представления следующим образом:

public void onClick(View v) {
        Toast.makeText(v.getContext(),"test", 
Toast.LENGTH_SHORT).show();
    }
0 голосов
/ 03 декабря 2018

Похоже, ваш mContext имеет значение null (я полагаю), потому что кажется, что вы его нигде не создавали.

Попробуйте этот код (вы можете скопировать / вставить)

public class ProductAdapter extends ArrayAdapter<Product> {

// Use getContext() instead of this property
//Context mContext;

public ProductAdapter(Activity context, ArrayList<Product> products) {
    super(context, 0, products);
}

@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {

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

    Product currentProduct = getItem(position);

    TextView nameTextView = (TextView) listItemView.findViewById(R.id.product_name);

    nameTextView.setText(currentProduct.getProductName());

    TextView numberTextView = (TextView) listItemView.findViewById(R.id.product_price);

    numberTextView.setText("$"+currentProduct.getProductPrice());

    ImageView iconView = (ImageView) listItemView.findViewById(R.id.list_item_icon);

    iconView.setImageResource(currentProduct.getProductImage());

    Button buyNow = (Button) listItemView.findViewById(R.id.buy_now);

    buyNow.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(getContext(),"test", Toast.LENGTH_SHORT).show();
        }
    });

    return listItemView;
  }
}

Nateчто я только что удалил ваше свойство mContext, потому что вы можете просто использовать getContext() в любом месте вашего адаптера.

...