Как счетчик ударов в recyclerview

#java #android #firebase #android-recyclerview

#java #Android #firebase #android-recyclerview

Вопрос:

Как реализовать подобное количество нажатий кнопок в RecyclerView. Я уже создал кнопку like и счетчик TextView с помощью этого кода, но когда я нажимаю кнопку like, приложение вылетает. Это мой код, что не так? Я использую кнопку переключения для опции like и TextView для подсчета подобных попаданий.

Это мой viewholder

 public class WritingsViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

public TextView MainTitle;
public ImageView Mainimage;
public ImageView Profimage;
public TextView ProfName;

public TextView txv;

public ToggleButton liketglbtn;


public TextView MainDesc, Idvkanme;
private ItemClickListner itemClickListner;

public void setItemClickListner(ItemClickListner itemClickListner) {
    this.itemClickListner = itemClickListner;
}




public WritingsViewHolder(View itemView) {
    super(itemView);

    MainTitle = (TextView)itemView.findViewById(R.id.RTitle);
    Mainimage = (ImageView)itemView.findViewById(R.id.rImageView);
    Profimage = (ImageView)itemView.findViewById(R.id.Profile_Image);
    ProfName = (TextView)itemView.findViewById(R.id.Prof_Name);
    MainDesc = (TextView)itemView.findViewById(R.id.rDescriptionTv);
    Idvkanme = (TextView)itemView.findViewById(R.id.Idavaka_Name);
    txv = (TextView)itemView.findViewById(R.id.tx);
    liketglbtn = (ToggleButton) itemView.findViewById(R.id.likeToggleBtn);

    itemView.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    itemClickListner.onClick(v,getAdapterPosition(),false);

}
  

}

Это моя деятельность

 public class WritingsActivity extends AppCompatActivity {


RecyclerView recyclerView;
FirebaseRecyclerOptions<IdavakaModel> options;
FirebaseRecyclerAdapter<IdavakaModel, WritingsViewHolder> adapter;
DatabaseReference MCC;
String categoryId = "";
RecyclerView.LayoutManager layoutManager;

TextView smsCountText;
int pendingSMSCount = 10;

static Button notifCount;
static int mNotifCount = 0;

Button FBcard, YoutubeCard;
private static final String APP_ID = "ca-app-pub-8867939169855032~9998384849";

Button mSaveBtn, mShareBtn;

private long backPressedTime;
private Toast backToast;

private int mCounter = 0;

ToggleButton btn;
TextView txv;

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


    FBcard = (Button) findViewById(R.id.button1);
    FBcard.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent toy = new Intent(WritingsActivity.this, IdavakaNewsUploadActivity.class);
            startActivity(toy);
            WritingsActivity.this.finish();

        }
    });
    
    MobileAds.initialize(this,APP_ID);
    AdView adView = (AdView) findViewById(R.id.adView);
    AdRequest adRequest = new AdRequest.Builder().build();
    adView.loadAd(adRequest);

   //Bottom Navigation Bar
    final BottomNavigationView bottomNavigationView = (BottomNavigationView)findViewById(R.id.botmnavigation);
    bottomNavigationView.setSelectedItemId(R.id.action_privacy);
    bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
            switch (menuItem.getItemId()){

                case R.id.myhome:
                    startActivity(new Intent(getApplicationContext(),MainActivity.class));
                    overridePendingTransition(0,0);
                    return true;

                case R.id.action_notification:
                    startActivity(new Intent(getApplicationContext(),ChristianNewsMainActivity.class));
                    overridePendingTransition(0,0);

                    return true;

                case R.id.action_privacy:

                    return true;

            }

            return false;
        }
    });
    
    MCC= FirebaseDatabase.getInstance().getReference().child("Writings");

    recyclerView = (RecyclerView) findViewById(R.id.readingroom_recyclerView);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    linearLayoutManager.setReverseLayout(true);
    linearLayoutManager.setStackFromEnd(true);
    recyclerView.setLayoutManager(linearLayoutManager);
    
    LoadData(categoryId);
}

private void LoadData(String categoryId) {

    options = new FirebaseRecyclerOptions.Builder<IdavakaModel>().setQuery(MCC,IdavakaModel.class).build();
    adapter = new FirebaseRecyclerAdapter<IdavakaModel, WritingsViewHolder>(options) {
        @Override
        protected void onBindViewHolder(@NonNull WritingsViewHolder writingsViewHolder, int i, @NonNull IdavakaModel idavakaModel) {

            writingsViewHolder.MainTitle.setText(idavakaModel.getTitle());
            writingsViewHolder.MainDesc.setText(idavakaModel.getDesc());
            writingsViewHolder.ProfName.setText(idavakaModel.getProfname());
            writingsViewHolder.Idvkanme.setText(idavakaModel.getIdavakaname());

            Picasso.get().load(idavakaModel.getPostimage())
                    .into(writingsViewHolder.Mainimage);
            Picasso.get().load(idavakaModel.getProfimage())
                    .into(writingsViewHolder.Profimage);
            
            writingsViewHolder.setItemClickListner(new ItemClickListner() {
                @Override
                public void onClick(View view, int position, boolean isLongClick) {

                    Intent detailsIntent = new Intent(WritingsActivity.this, IdavakaDetailActivity.class);
                    detailsIntent.putExtra("CategoryId", adapter.getRef(position).getKey());
                    startActivity(detailsIntent);

                }
            });


            writingsViewHolder.liketglbtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mCounter  ;
                    txv.setText(Integer.toString(mCounter));

                }
            });
        }

        @NonNull
        @Override
        public WritingsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.writngs_items, parent, false);

            return new WritingsViewHolder(v);
        }
    };

    adapter.startListening();
    recyclerView.setAdapter(adapter);
}

@Override
public void onBackPressed() {
    if (backPressedTime   2000 > System.currentTimeMillis()) {
        backToast.cancel();
        super.onBackPressed();
        WritingsActivity.this.finish();
        return;


    } else {
        backToast = Toast.makeText(getBaseContext(), "See You Soon", Toast.LENGTH_SHORT);
        backToast.show();

    }
    backPressedTime = System.currentTimeMillis();
    WritingsActivity.this.finish();
}

public void onCustomToggleClick (View  view) {
    Toast.makeText(this, "Liked",Toast.LENGTH_SHORT).show();

}
  

}

Комментарии:

1. Пожалуйста, добавьте журналы сбоев для дальнейшей диагностики

2. это ожидание нулевой точки для счетчика textview.

3. Если приложение выходит из строя, происходит трассировка стека. Пожалуйста, посмотрите это на logcat и добавьте его в свой вопрос.

Ответ №1:

Вы получаете исключение NullPointerException, потому что используемый вами TextView находится в Activity с именем txv, где вы устанавливаете счетчик. Но проблема в том, что вы объявили TextView в Activity, но не инициализировали нигде в Activity. Вы ДОЛЖНЫ инициализировать эту переменную с помощью метода findViewById перед установкой значений. Кроме того, вы инициализировали txv TextView и получили доступ к активности, поэтому вы получаете NLP. TextView — это часть макета активности, которую вы не инициализировали. С другой стороны, вы инициализировали txv в адаптере, который бесполезен.

Комментарии:

1. Я знаю об этом. но моя проблема в том, что я использую textview в itemxml, а не в actvityxml. Итак, я не знаю, где я могу объявить txv в activity.java

2. из-за этого является представление recycler. итак, textview и togglebutton являются частью моего XML-макета элемента. в activity xml я реализую только recyclerview. Поэтому, когда я объявил текстовое представление в activity java, оно снова показывает ожидание нулевой точки. извините за мой плохой английский.