2016-10-03 1 views
-1

У меня есть этот класс адаптера, где у меня есть объект со списком в нем.Как сделать несколько просмотров в элементе recyclerview clickable?

public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.ProductViewHolder> { 
private Context context; 
private Shop shop; 

public ProductAdapter(Context context, Shop shop) { 
    this.context = context; 
    this.shop = shop; 
} 

@Override 
public ProductViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
    View v = inflater.inflate(R.layout.product_row, parent, false); 
    return new ProductViewHolder(v); 
} 

@Override 
public void onBindViewHolder(ProductViewHolder holder, int position) { 
    holder.tvProductTitle.setText(shop.products.get(position).getTitle()); 
    holder.tvProductDescription.setText(shop.products.get(position).getDescription()); 
    Glide.with(context) 
      .load(shop.products.get(position).getImageUrl()) 
      .placeholder(android.R.drawable.ic_menu_upload_you_tube) 
      .error(android.R.drawable.stat_notify_error) 
      .diskCacheStrategy(DiskCacheStrategy.RESULT) 
      .into(holder.ivProduct); 
} 

@Override 
public int getItemCount() { 
    if (shop.products != null) { 
     return shop.products.size(); 
    } 
    return 0; 
} 

public static class ProductViewHolder extends RecyclerView.ViewHolder { 
    private TextView tvProductTitle, tvProductDescription; 
    private ImageView ivProduct; 

    public ProductViewHolder(View itemView) { 
     super(itemView); 
     tvProductTitle = (TextView) itemView.findViewById(R.id.tvProductTitle); 
     tvProductDescription = (TextView) itemView.findViewById(R.id.tvProductDescription); 
     ivProduct = (ImageView) itemView.findViewById(R.id.ivProduct); 
    } 
} 

public interface ClickListener { 
    void onClick(View v, int position); 

    void onLongClick(View v, int position); 
} 

public static class RecyclerTouchListener implements RecyclerView.OnItemTouchListener { 
    private GestureDetector gestureDetector; 
    private ProductAdapter.ClickListener clickListener; 

    public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ProductAdapter.ClickListener clickListener) { 
     this.clickListener = clickListener; 
     gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { 
      @Override 
      public boolean onSingleTapUp(MotionEvent e) { 
       return true; 
      } 

      @Override 
      public void onLongPress(MotionEvent e) { 
       View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); 
       if (child != null && clickListener != null) { 
        clickListener.onLongClick(child, recyclerView.getChildAdapterPosition(child)); 
       } 
      } 
     }); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { 
     View child = rv.findChildViewUnder(e.getX(), e.getY()); 
     if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) { 
      clickListener.onClick(child, rv.getChildAdapterPosition(child)); 
     } 
     return false; 
    } 

    @Override 
    public void onTouchEvent(RecyclerView rv, MotionEvent e) { 

    } 

    @Override 
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { 

    } 
} 

Я использую этот адаптер в моем фрагменте, где я могу выбрать элемент из recyclerview который откроет другую деятельность с выбранным продуктом, и это parametars. Вместо того, чтобы щелкнуть весь элемент, я хотел бы щелкнуть его часть (скажем, изображение), которая будет делать то же самое, что и сейчас. Но я также хотел бы поместить флажок в элемент recyclerview, который будет иметь другую функцию. На данный момент я не могу использовать намерение в классе адаптера. Теперь, когда он настроен, я могу щелкнуть весь элемент. Как я могу заставить его работать, как я объяснил выше?

public class ProductsFragment extends android.support.v4.app.Fragment { 
private RecyclerView rvProduct; 
private RecyclerView.LayoutManager layoutManager; 
private ProductAdapter productAdapter; 

public static ProductsFragment newInstance(Bundle args) { 
    ProductsFragment fragment = new ProductsFragment(); 
    fragment.setArguments(args); 
    return fragment; 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.fragment_products, container, false); 
    rvProduct = (RecyclerView) v.findViewById(R.id.rvProduct); 
    rvProduct.setHasFixedSize(true); 
    layoutManager = new GridLayoutManager(getContext(), 2); 
    rvProduct.setLayoutManager(layoutManager); 
    Bundle bundle = getArguments(); 
    final Shop shop = (Shop) bundle.getSerializable("shop"); 
    productAdapter = new ProductAdapter(getContext(), shop); 
    rvProduct.setAdapter(productAdapter); 
    productAdapter.notifyDataSetChanged(); 

    rvProduct.addOnItemTouchListener(new ProductAdapter.RecyclerTouchListener(getContext(), rvProduct, new ProductAdapter.ClickListener() { 
     @Override 
     public void onClick(View v, int position) { 
      Intent details = new Intent(getContext(), ProductDetailsActivity.class); 
      details.putExtra("product", shop.products.get(position)); 
      startActivity(details); 
     } 

     @Override 
     public void onLongClick(View v, int position) { 

     } 
    })); 
    return v; 
} 
} 

EDIT: мне удалось это сделать, пожалуйста, скажи мне, если это правильно и эффективный способ:

holder.tvProductTitle.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent i = new Intent(context, ProductDetailsActivity.class); 
      i.putExtra("product", shop.products.get(position)); 
      context.startActivity(i); 
     } 
    }); 

ответ

1

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

Вместо этого вы должны установить слушателей в классе адаптера ViewHolder. И используйте метод getAdapterPosition(), чтобы получить позицию щелкнутого элемента. Например:

public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.ProductViewHolder> {  
private Context context; private Shop shop; 
public ProductAdapter(Context context, Shop shop) { 
this.context = context; 
this.shop = shop; 
} 
@Override public ProductViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
View v = inflater.inflate(R.layout.product_row, parent, false); 
return new ProductViewHolder(v); 
} 
@Override public void onBindViewHolder(ProductViewHolder holder, int position) { 
holder.tvProductTitle.setText(shop.products.get(position).getTitle()); 
holder.tvProductDescription.setText(shop.products.get(position).getDescription()); 
Glide.with(context) .load(shop.products.get(position).getImageUrl()) .placeholder(android.R.drawable.ic_menu_upload_you_tube) .error(android.R.drawable.stat_notify_error) .diskCacheStrategy(DiskCacheStrategy.RESULT) .into(holder.ivProduct); 
} 
@Override public int getItemCount() 
{ 
    if (shop.products != null) { 
    return shop.products.size(); 
    } return 0; 
} 

public static class ProductViewHolder extends RecyclerView.ViewHolder { 
private TextView tvProductTitle, tvProductDescription; 
private ImageView ivProduct; 
public ProductViewHolder(View itemView) 
{ 
    super(itemView); 
    tvProductTitle = (TextView) itemView.findViewById(R.id.tvProductTitle); 
    tvProductDescription = (TextView) itemView.findViewById(R.id.tvProductDescription); 
ivProduct = (ImageView) itemView.findViewById(R.id.ivProduct); 
// Set onclickListener on image 
ivProduct.setOnCliCkListener(new onClickListener(){ 
    @Override 
    public void onClick(View v){ 
    Intent i = new Intent(context, ProductDetailsActivity.class);  
i.putExtra("product",  
shop.products.get(getAdapterPosition())); 
context.startActivity(i); 
} 
} 
} 
} 
public interface ClickListener { 
void onClick(View v, int position); 
    void onLongClick(View v, int position); 
} 
    } 
+0

Отлично, так оно и работает! – jlively

+0

Удовольствие, чтобы помочь вам. Если вы хотите, вы можете подтвердить ответ, чтобы отметить его правильность. –

0

Вы можете добавить клики слушателей к каждому соответствующему мнению надутого публичный элемент onBindViewHolder. Вы считали это?

Редактировать: Хорошо, это то, что вы сделали. Однако я не знаю об эффективности, но так я и делал.

 Смежные вопросы

  • Нет связанных вопросов^_^