单击一个卡片视图会影响另一个卡片视图值

cwdobuhd  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(270)

当我在“回收器”视图中创建自定义卡片视图并单击“增量”按钮时,计数器将正常工作。但当我创建另一个cardview时,已经创建的卡计数器值重置为0。如何解决这个问题?
这是我的主要活动代码

package com.example.muhasbaapp;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.lang.reflect.Type;
import java.util.ArrayList;
import com.example.muhasbaapp.CustomAdapter.ViewHolder.*;

public class MainActivity extends AppCompatActivity {
    private static RecyclerView.Adapter mAdapter,countAdapter;
    private RecyclerView.LayoutManager layoutManager,layoutManager2;
    private static RecyclerView recyclerView,recyclerView2;
    private ImageView imageView;
    public CustomModel customModel;
    public static ArrayList<String> input = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

       // myOnClickListener = new MyOnClickListener(this);
        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        recyclerView2=(RecyclerView)findViewById(R.id.recycler_view2);
        recyclerView.setHasFixedSize(true);
        recyclerView2.setHasFixedSize(true);

        layoutManager2=new LinearLayoutManager(this);  
        recyclerView2.setLayoutManager(layoutManager2);
        recyclerView2.setItemAnimator(new DefaultItemAnimator());

        mAdapter= new CustomAdapter(input);
        recyclerView2.setAdapter(mAdapter);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.more_action_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) { //add action2 kau kat sini
        switch (item.getItemId()) {
            case R.id.action_item_1:
                openCustomDialoge();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }

    }

    private void openCustomDialoge() {
        final AlertDialog dialogBuilder = new AlertDialog.Builder(this).create();
        LayoutInflater inflater = this.getLayoutInflater();
        View dialogView = inflater.inflate(R.layout.user_generated_cards, null);

        final EditText editText = (EditText) dialogView.findViewById(R.id.edt_comment);
        Button button1 = (Button) dialogView.findViewById(R.id.buttonSubmit);
        Button button2 = (Button) dialogView.findViewById(R.id.buttonCancel);

        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dialogBuilder.dismiss();
            }
        });
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String s=editText.getText().toString();
                if (s.isEmpty()){
                    Toast.makeText(MainActivity.this, "You can't enter empty spaces", Toast.LENGTH_SHORT).show();
                }else {
                    input.add(s);
                    recyclerView2.setAdapter(mAdapter);
                    dialogBuilder.dismiss();
                }
            }
        });

        dialogBuilder.setView(dialogView);
        dialogBuilder.show();
    }

}

这是我的Adapter类代码

package com.example.muhasbaapp;

import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {
    public ArrayList<String> values;
    final CustomModel customMdl=new CustomModel();
    final MainActivity mainActivity=new MainActivity();

    // Provide a reference to the views for each data item
    // Complex data items may need more than one view per item, and
    // you provide access to all the views for a data item in a view holder
    public class ViewHolder extends RecyclerView.ViewHolder {
        // each data item is just a string in this case
        public TextView tv;
        public View layout;
        public TextView counter_value;
        public ImageView increment,decrement, deleted;
        public int counter;

        public ViewHolder(View v) {
            super(v);
            layout = v;
            tv = (TextView) v.findViewById(R.id.textViewName);
            counter_value=(TextView) v.findViewById(R.id.counter);
            increment=(ImageView)v.findViewById(R.id.increment);
            decrement=(ImageView)v.findViewById(R.id.decrement);
            deleted=(ImageView)v.findViewById(R.id.delbtn);

        }
    }

    public void add(int position, String item) {
        values.add(position, item);
        notifyItemInserted(position);
    }

    public void remove(int position) {
            values.remove(position);
            notifyItemRemoved(position);
            notifyItemRangeChanged(position, values.size());

    }

    // Provide a suitable constructor (depends on the kind of dataset)
    public CustomAdapter(ArrayList<String> myDataset) {
        this.values = myDataset;
    }

    // Create new views (invoked by the layout manager)
    @Override
    public CustomAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                       int viewType) {
        // create a new view
        LayoutInflater inflater = LayoutInflater.from(
                parent.getContext());
        View v =
                inflater.inflate(R.layout.custom_cards_layout, parent, false);
        // set the view's size, margins, paddings and layout parameters
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {

        // - get element from your dataset at this position
        // - replace the contents of the view with that element
        final String name = values.get(position);
        holder.tv.setText(name);
        final int[] counter={0};
        holder.deleted.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                remove(position);
            }
        });

        holder.decrement.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (counter[0] == 0) {
                    Toast.makeText(v.getContext(), "Can't add less than 0", Toast.LENGTH_SHORT).show();
                } else {
                    counter[0] -= 1;
                    holder.counter_value.setText(String.valueOf(counter[0]));
                }

            }
        });

        holder.increment.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                holder.decrement.setEnabled(true);
                counter[0] += 1;
                holder.counter_value.setText(String.valueOf(counter[0]));
            }
        });
    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return values.size();
    }

}

如果有人知道这个问题,请通知我。提前谢谢

4nkexdtk

4nkexdtk1#

我在你的代码中看到了一些不好的做法:
主活动中承载的适配器必须不是静态的,如果尝试通过 recyclerView.getAdapter() 请移除适配器中的下一个

final MainActivity mainActivity = new MainActivity();

所以你的问题是在你的点击监听器里面。

button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        String s = editText.getText().toString();
        if (s.isEmpty()) {
            Toast.makeText(MainActivity.this, "You can't enter empty spaces", Toast.LENGTH_SHORT).show();
        } else {
            input.add(s); // <-------------- HERE
            recyclerView2.setAdapter(mAdapter);
            dialogBuilder.dismiss();
        }
    }
});

您将新项添加到数组中,但是适配器从不知道有新项已添加。
访问已连接到的示例适配器 RecyclerViewonCreate() 逐步更新他们的数据。

相关问题