Обновление специфицированного поля c firebase с помощью кнопки повторного просмотра в android - PullRequest
0 голосов
/ 24 марта 2020

Я разрабатываю приложение для голосования с использованием Android Studio в Java, которое использует RecyclerView для вывода списка всех кандидатов из базы данных Firebase. Я могу перечислить всех кандидатов, но не могу реализовать кнопку голосования, чтобы обновить только определенное количество голосов c кандидата.

Database structure

Данные выбраны и отображены в RecyclerView следующим образом: Информация о кандидатах в RecyclerView: Candidates information in RecyclerView.

Мне нужно каждый раз, когда пользователь нажимает кнопку голосования, поле базы данных totalVotes обновляется с + 1.

Код MyAdapter:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    Context context;
    ArrayList <Candidate> candidates;
    private DatabaseReference mDatabase;


    public MyAdapter (Context c, ArrayList<Candidate> p){
        context = c;
        candidates =p;
    }


    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.cardview, parent, false));
    }
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        holder.name.setText(candidates.get(position).getFirstname());
        holder.party.setText(candidates.get(position).getParty());
        holder.category.setText(candidates.get(position).getCategory());
        Picasso.get().load(candidates.get(position).getImageurl()).into(holder.profilepic);

        holder.onClick(position);
    }

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

    class MyViewHolder extends RecyclerView.ViewHolder{

        TextView name, party, category;
        ImageView profilepic;
        Button vote;

        public MyViewHolder(View itemView) {
            super(itemView);
            name = (TextView) itemView.findViewById(R.id.name);
            party = (TextView) itemView.findViewById(R.id.party);
            profilepic = (ImageView) itemView.findViewById(R.id.profilepic);
            category = (TextView) itemView.findViewById(R.id.category);
            vote = (Button) itemView.findViewById(R.id.vote);
        }

        public void onClick(int position){
            vote.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                }
            });
        }
    }


}

Класс AllCandidates, который обрабатывает адаптер:

private DatabaseReference reference;
    private RecyclerView recyclerView;
    private ArrayList<Candidate> list;
    private ArrayList<CandidateIMage> listimage;
    private MyAdapter adapter;
    private DatabaseReference imagereference;
    FirebaseStorage storage;
    StorageReference storageReference;

    private static final String TAG = "AllCandidates";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.all_candidates);

        //reference= FirebaseDatabase.getInstance().getReference().child("candidates");
        recyclerView = (RecyclerView) findViewById(R.id.myRecycler);

        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        list = new ArrayList<Candidate>();
        listimage = new ArrayList<CandidateIMage>();

        reference = FirebaseDatabase.getInstance().getReference();

        Query presidentquery = reference.child("candidates").orderByChild("category").equalTo("President");
        presidentquery.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
                        Candidate p = dataSnapshot1.getValue(Candidate.class);
                        //String userId = dataSnapshot1.getKey();
                        //System.out.println("User id to be passed is: "+userId);
                        list.add(p);
                    }
                    adapter = new MyAdapter(AllCandidates.this, list);
                    recyclerView.setAdapter(adapter);
                }
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });
        };
    }

Я пытался добавить этот код в voice.onclicklostener, но он не работает :

public void onClick(final int position){
            postRef = FirebaseDatabase.getInstance().getReference("candidates");
            vote.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    postRef.runTransaction(new Transaction.Handler() {
                        @Override
                        public Transaction.Result doTransaction(MutableData mutableData) {
                            Candidate p = mutableData.getValue(Candidate.class);
                            if (p == null) {
                                return Transaction.success(mutableData);
                            } else {
                                int fetched = p.getTotalVotes();
                                fetched = fetched + 1;

                                String userId = postRef.push().getKey();
                                // Set value and report transaction success
                                postRef.child(userId).child("totalVotes").setValue(fetched);

                                //mutableData.setValue(p);
                                return Transaction.success(mutableData);
                            }
                        }
                        @Override
                        public void onComplete(DatabaseError databaseError, boolean b,
                                               DataSnapshot dataSnapshot) {
                            // Transaction completed
                            Log.d(TAG, "postTransaction:onComplete:" + databaseError);
                        }
                    });
                }


            });
        }

Мой кандидат m0del выглядит так:

@IgnoreExtraProperties
public class Candidate {
    private String firstname;
    private String lastname;
    private String party;
    private String category;
    private String candidateemail;
    private String imageurl;
    public Integer totalVotes;

    // Default constructor required for calls to
    // DataSnapshot.getValue(Candidate.class)
    public Candidate() {
    }

    public Candidate(String imageurl, String candidateemail, String firstname, String lastname, String party, String category, Integer totalVotes) {

        this.candidateemail = candidateemail;
        this.imageurl = imageurl;
        this.firstname = firstname;
        this.lastname = lastname;
        this.party = party;
        this.category = category;
        this.totalVotes = totalVotes;
    }

    public String getCandidateemail() {
        return candidateemail;
    }

    public void setCandidateemail(String candidateemail) {
        this.candidateemail = candidateemail;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

    public String getLastname() {
        return lastname;
    }

    public void setLastname(String lastname) {
        this.lastname = lastname;
    }

    public String getParty() {
        return party;
    }

    public void setParty(String party) {
        this.party = party;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public Integer getTotalVotes() {
        return totalVotes;
    }

    public void setTotalVotes(Integer totalVotes) {
        this.totalVotes = totalVotes;
    }

    public String getImageurl() {
        return imageurl;
    }

    public void setImageurl(String imageurl) {
        this.imageurl = imageurl;
    }

1 Ответ

0 голосов
/ 24 марта 2020

Согласно вашему комментарию:

Когда я нажимаю на кнопку голосования, она создает новую запись в базе данных, вместо обновления поля totaLVotes указанного c, за который проголосовали кандидат.

Это происходит потому, что вы неправильно используете транзакцию. Когда вы используете следующие строки кода:

String userId = postRef.push().getKey();
postRef.child(userId).child("totalVotes").setValue(fetched);

Вы вводите в базу данных каждый раз, когда новый итог, так как при вызове .push() генерируется новый случайный ключ каждый раз, когда вызывается. Чтобы обновить только свойство totalVotes, используйте следующий метод:

public static void updateTotalVotes(String operation) {
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference totalVotesRef = rootRef.child("candidates").child("-M35sglMi8onCgvEDzbm").child("totalVotes");
    totalVotesRef.runTransaction(new Transaction.Handler() {
        @Override
        public Transaction.Result doTransaction(MutableData mutableData) {
            Integer votes = mutableData.getValue(Integer.class);
            if (votes == null) {
                return Transaction.success(mutableData);
            }

            if (operation.equals("increaseTotalVotes")) {
                mutableData.setValue(votes + 1);
            } else if (operation.equals("decreaseTotalVotes")){
                mutableData.setValue(votes - 1);
            }

            return Transaction.success(mutableData);
        }

        @Override
        public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {
            Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
        }
    });
}

Смотрите, вы должны установить использование ссылки, указывающей на свойство totalVotes. Теперь начните с:

updateTotalVotes("increaseTotalVotes");

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...