簡體   English   中英

我無法讓我的 OnClick 方法在 RecyclerView 中工作

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

我一直在嘗試使用 OnClick RecyclerView 方法從 firebase 中刪除數據,但沒有任何效果。 我什至無法使我的 OnClick 方法起作用。 我看過視頻和教程,我嘗試了很多東西但沒有任何幫助......這是我的適配器 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);

    }
}

還有我的片段(有 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);
        }
    });

}

如果有人能告訴我該做什么和怎么做,請..我非常需要它

嘗試在 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
   }
}

您可以使用以下代碼申請 onclick 偵聽器:

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

將此代碼添加到適配器的onBindViewHolder中。 只需確保更改持有人的 ID。

完整代碼:

@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.
        }
    });
}

在您的視圖持有者內創建 object 視圖,並在 viewHolder 本身內初始化 button.setOnClickListener(this) 並在 onBinfViewHolder(...) 內設置點擊(僅在 JAVA 中)。 在 kotlin 中,您只需要在 onBindViewHolder(...) 中設置點擊方法。

例子:

 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