简体   繁体   English

我无法让我的 OnClick 方法在 RecyclerView 中工作

[英]I can't make my OnClick method work in a RecyclerView

I've been trying to delete data from firebase with an OnClick RecyclerView method, but nothing works.我一直在尝试使用 OnClick RecyclerView 方法从 firebase 中删除数据,但没有任何效果。 I can't even make my OnClick method works.我什至无法使我的 OnClick 方法起作用。 I have watched videos and tutorials, I've tried so much stuff and nothing helps... Here is my adapter class:我看过视频和教程,我尝试了很多东西但没有任何帮助......这是我的适配器 class:

public class myadapter extends RecyclerView.Adapter<myadapter.myviewholder>{

ArrayList<datamodel> dataholder;

public myadapter(ArrayList<datamodel> dataholder) {
    this.dataholder = dataholder;

}

@NonNull
@Override
public myviewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);
    return new myviewholder(view);

}


@Override
public void onBindViewHolder(@NonNull myviewholder holder, int position) {
    Glide.with(holder.itemView.getContext()).load(dataholder.get(position).getImageurl()).into(holder.CircleImg);
    holder.header.setText(dataholder.get(position).getHeader());
    holder.descr.setText(dataholder.get(position).getDescr());
    holder.price.setText(dataholder.get(position).getPrec());

}

@Override
public int getItemCount() {
    return dataholder.size();
}

class myviewholder extends RecyclerView.ViewHolder{
    CircleImageView CircleImg;
    TextView header, descr, price;

    public myviewholder(@NonNull View itemView) {
        super(itemView);
        CircleImg = itemView.findViewById(R.id.circle1);
        header = itemView.findViewById(R.id.txtheader1);
        descr = itemView.findViewById(R.id.txtdescr1);
        price = itemView.findViewById(R.id.txtprecio1);

    }
}

And my fragment (the one that have the recyclerView):还有我的片段(有 recyclerView 的片段):

public class articulos extends Fragment {

private FirebaseUser firebaseUser;
private String uid;

// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
private DatabaseReference myRef;
private Context mContext;
private myadapter myadapter;


RecyclerView recyclerView;
ArrayList<datamodel> dataholder;

public articulos() {
    // Required empty public constructor
}

/**
 * Use this factory method to create a new instance of
 * this fragment using the provided parameters.
 *
 * @param param1 Parameter 1.
 * @param param2 Parameter 2.
 * @return A new instance of fragment articulos.
 */
// TODO: Rename and change types and number of parameters
public static articulos newInstance(String param1, String param2) {
    articulos fragment = new articulos();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_articulos, container, false);
    recyclerView = view.findViewById(R.id.rv);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

    myRef = FirebaseDatabase.getInstance().getReference();
    dataholder= new ArrayList<>();
    getDataFromFirebase();

    //datamodel ob1 = new datamodel("Esta nueva", "5000MXN", "wwsad.adasd", "asdasdsa");
   // dataholder.add(ob1);

    //recyclerView.setAdapter(new myadapter(dataholder));


    return view;
}



private void getDataFromFirebase() {

    firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
    uid = firebaseUser.getUid();
    Query query = myRef.child("Usuarios").child(uid).child("articulos");
    query.addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            ClearAll();
            for(DataSnapshot snapshot1 : snapshot.getChildren()){
                datamodel datamodel = new datamodel();

                datamodel.setImageurl(snapshot1.child("imageurl").getValue(String.class));
                datamodel.setDescr(snapshot1.child("descripcion").getValue(String.class));
                datamodel.setHeader(snapshot1.child("nombre").getValue(String.class));
                datamodel.setPrec(snapshot1.child("precio").getValue(String.class));
                dataholder.add(datamodel);
            }

            myadapter = new myadapter(dataholder);
            recyclerView.setAdapter(new myadapter(dataholder));
            myadapter.notifyDataSetChanged();
        }


        @Override
        public void onCancelled(@NonNull DatabaseError error) {
        }
    });
}

private void ClearAll(){
    if(dataholder != null){
        dataholder.clear();

        if(myadapter != null){
            myadapter.notifyDataSetChanged();
        }

    }
    dataholder = new ArrayList<>();
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Button mbtnNuevoArticulo = view.findViewById(R.id.btnNuevoArticulo);

    mbtnNuevoArticulo.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Navigation.findNavController(v).navigate(R.id.agregarart);
        }
    });

}

If anyone can tell me what to do and how to do it, please.. I need it so bad如果有人能告诉我该做什么和怎么做,请..我非常需要它

Try set onclicklistener on viewholder class尝试在 viewholder class 上设置 onclicklistener

class myviewholder extends RecyclerView.ViewHolder implements View.OnClickListener {
    CircleImageView CircleImg;
    TextView header, descr, price;

    public myviewholder(@NonNull View itemView) {
        super(itemView);
        CircleImg = itemView.findViewById(R.id.circle1);
        header = itemView.findViewById(R.id.txtheader1);
        descr = itemView.findViewById(R.id.txtdescr1);
        price = itemView.findViewById(R.id.txtprecio1);

        itemView.setOnClickListener(this);

    }


  @Override
      public void onClick(View view) {
       //do something when clicked
   }
}

You can apply onclick listener by using following code:您可以使用以下代码申请 onclick 侦听器:

holder.header.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //do something.
    }
});

add this code in your onBindViewHolder of Adapter.将此代码添加到适配器的onBindViewHolder中。 Just make sure to change the id of holder.只需确保更改持有人的 ID。

full code:完整代码:

@Override
public void onBindViewHolder(@NonNull myviewholder holder, int position) {
    Glide.with(holder.itemView.getContext()).load(dataholder.get(position).getImageurl()).into(holder.CircleImg);
    holder.header.setText(dataholder.get(position).getHeader());
    holder.descr.setText(dataholder.get(position).getDescr());
    holder.price.setText(dataholder.get(position).getPrec());
    holder.header.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //do something.
        }
    });
}

Create object of view inside your view holder and also initialize button.setOnClickListener(this) inside viewHolder itself and setting on click inside onBinfViewHolder(...)(only in JAVA).在您的视图持有者内创建 object 视图,并在 viewHolder 本身内初始化 button.setOnClickListener(this) 并在 onBinfViewHolder(...) 内设置点击(仅在 JAVA 中)。 In kotlin you just need to set on click method inside onBindViewHolder(...).在 kotlin 中,您只需要在 onBindViewHolder(...) 中设置点击方法。

Example:例子:

 class YourAdapter():RecyclerView.Adapter<YourAdapter.YourViewHolder>() {

 class YourViewHolder(view: View):RecyclerView.ViewHolder(view){
   
    val yourButton:Button = view.findViewById(R.id.landingViewBtn)
 }

override fun onBindViewHolder(holder: YourViewHolder, position: Int) {
  
   
    holder.yourButton.setOnClickListener {
        //do Something
        val intent = Intent(context,nextActivity::class.java)
       
        context.startActivity(intent)
    }
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM