Я полностью следую этому руководству, внося несколько незначительных изменений для собственного использования: Руководство по Android RecyclerView и CardView

(Смысл моего приложения в том, что когда вы нажимаете fab, появляется cardview. Внутри каждого cardview есть spinner, edittext, textview и {{ X5 } } . )

Однако мне нужно, наконец, добавить код в FAB, чтобы добавить cardview. Но я не уверен, как это сделать со всем, что я сделал с адаптерами. в руководстве меня просили сделать productList = new ArrayList<>();, поэтому я мог использовать productList.add, но я не знаю, как дальше двигаться дальше.

Вот фрагмент кода моей основной деятельности:

FloatingActionButton floatingActionButton =(FloatingActionButton) findViewById(R.id.fab);

floatingActionButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        productList.add //what goes here???//
    }
});

И это мой текущий код create.java (в котором находится приведенный выше фрагмент)

public class create extends AppCompatActivity {

    //a list to store all the products
    List<Product> productList;

    //the recyclerview
    RecyclerView recyclerView;

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

        //opens csv
        InputStream inputStream = getResources().openRawResource(R.raw.shopitems);
        CSVFile csvFile = new CSVFile(inputStream);

        Product.spinnerItemsList = csvFile.read();

        //getting the recyclerview from xml
        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        //initializing the productlist
        productList = new ArrayList<>();

        //TODO FAB BUTTON
        FloatingActionButton floatingActionButton =
                (FloatingActionButton) findViewById(R.id.fab);

        floatingActionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                productList.add //what goes here???//
            }
        });

        //creating recyclerview adapter
        ProductAdapter adapter = new ProductAdapter(this, productList);

        //setting adapter to recyclerview
        recyclerView.setAdapter(adapter);
    }

    private class CSVFile {
        InputStream inputStream;

        public CSVFile(InputStream inputStream) {
            this.inputStream = inputStream;
        }

        public List<String> read() {
            List<String> resultList = new ArrayList<String>();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            try {
                String line;
                while ((line = reader.readLine()) != null) {
                    String[] row = line.split(",");
                    //TODO I edited this part so that you'd add the values in our new hash map variable
                    /*
                    numberItemValues.put(row[1], row[0]);
                    */
                    resultList.add(row[1]);
                }
            } catch (IOException e) {
                Log.e("Main", e.getMessage());
            } finally {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    Log.e("Main", e.getMessage());
                }
            }
            return resultList;
        }
    }
}

Это MyListAdapter.java, предназначенный для Spinner.

public class MyListAdapter extends ArrayAdapter<String> {
    int groupid;
    List<String> items;
    Context context;
    String path;

    public MyListAdapter(Context context, int vg, int id, List<String> items) {
        super(context, vg, id, items);
        this.context = context;
        groupid = vg;
        this.items = items;
    }

    static class ViewHolder {
        public TextView textid;
        public TextView textname;
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        {
            View rowView = convertView;
            if (rowView == null) {
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                rowView = inflater.inflate(groupid, parent, false);
                ViewHolder viewHolder = new ViewHolder();
                viewHolder.textid = (TextView) rowView.findViewById(R.id.txtid);
                viewHolder.textname = (TextView) rowView.findViewById(R.id.txtname);
                rowView.setTag(viewHolder);
            }
            // Fill data in the drop down.
            ViewHolder holder = (ViewHolder) rowView.getTag();
            String row = items.get(position);
            //holder.textid.setText(row[0]); //prints aisle number, dont need

            holder.textname.setText(row);

            return rowView;
        }
    }
}

Это Product.Java из учебника

public class Product {

    private String editText;
    private Boolean checkBox;
    private String textView5;

    public static List<String> spinnerItemsList = new ArrayList<String>();

    public Product(List spinner, String editText, Boolean checkBox, String textView5) {
        this.editText = editText;
        this.checkBox = checkBox;
        this.textView5 = textView5;
    }
    public String getEdittext () {
        return editText;
    }

    public boolean getCheckbox () {
        return checkBox;
    }

    public String getTextview () {
        return textView5;
    }
}

И это ProductAdapter.java также из учебника

public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.ProductViewHolder> {

    //this context we will use to inflate the layout
    private Context mCtx;
    private Spinner spinner;

    //we are storing all the products in a list
    private List<Product> productList;

    //getting the context and product list with constructor
    public ProductAdapter(Context mCtx, List<Product> productList) {
        this.mCtx = mCtx;
        this.productList = productList;
    }

    @Override
    public ProductViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //inflating and returning our view holder
        LayoutInflater inflater = LayoutInflater.from(mCtx);
        View view = inflater.inflate(R.layout.layout_products, null);
        return new ProductViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ProductViewHolder holder, int position) {
        //getting the product of the specified position
        Product product = productList.get(position);

        //binding the data with the viewholder views

        MyListAdapter adapter = new MyListAdapter(mCtx, R.layout.listrow, R.id.txtid, Product.spinnerItemsList);

        spinner.setAdapter(adapter);
    }

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

    class ProductViewHolder extends RecyclerView.ViewHolder {

        Spinner spinner;
        EditText editText;
        TextView textView5;
        CheckBox checkBox;

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

            spinner = itemView.findViewById(R.id.spinner);
            editText = itemView.findViewById(R.id.editText);
            textView5 = itemView.findViewById(R.id.textView5);
            checkBox = itemView.findViewById(R.id.checkBox);
        }
    }
}

Я сделал то же самое, что и в учебнике fyi.

РЕДАКТИРОВАТЬ

 final Spinner spinner;
      final EditText editText;
      final CheckBox checkBox;
      final TextView textView5;

      spinner = findViewById(R.id.spinner);
      editText = findViewById(R.id.editText);
      checkBox = findViewById(R.id.checkBox);
      textView5 = findViewById(R.id.textView5);

      final ProductAdapter  adapter = new ProductAdapter(this, productList);

        //TODO FAB BUTTON
        FloatingActionButton floatingActionButton =
                (FloatingActionButton) findViewById(R.id.fab);


        floatingActionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {



                Product mProduct = new Product(List spinner, String editText, Boolean checkBox, String textView5);
                productList.add(mProduct); //what goes here???//
                if(adapter != null)
                    adapter.notifyDataSetChanged();
                //Handle the empty adapter here

            }
        });

Layout_products.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="8dp">


            <Spinner
                android:id="@+id/spinner"
                android:layout_width="159dp"
                android:layout_height="wrap_content"
                android:layout_alignParentStart="true"
                android:layout_centerVertical="true" />

            <CheckBox
                android:id="@+id/checkBox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentEnd="true"
                android:layout_alignParentTop="true"
                android:layout_marginEnd="36dp" />

            <TextView
                android:id="@+id/textView5"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentEnd="true"
                android:layout_centerVertical="true"
                android:layout_marginEnd="89dp"
                android:text="TextView" />

            <EditText
                android:id="@+id/editText"
                android:layout_width="34dp"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_centerHorizontal="true"
                android:ems="10"
                android:inputType="number" />
        </RelativeLayout>

    </android.support.v7.widget.CardView>

</LinearLayout>
0
Grand Skunk 25 Сен 2018 в 12:12

2 ответа

Лучший ответ

Измените модель вашего продукта с помощью следующих

public class Product {

    private String editText;
    private Boolean checkBox;
    private String textView5;

   // The following list is useless unless u don't use it somewhere so lets create getters and setters for this item
   private List<String> spinnerItemsList = new ArrayList<String>();

    public Product(List spinner, String editText, Boolean checkBox, String textView5) {

        this.editText = editText;
        this.spinnerItemsList = spinner;
        this.checkBox = checkBox;
        this.textView5 = textView5;
    }
    public String getEdittext () {
        return editText;
    }

    public boolean getCheckbox () {
        return checkBox;
    }

    public String getTextview () {
        return textView5;
    }
    public String getSpinnerItemsList () {
        return spinnerItemsList;
    }
}

Что ж, я думаю, вам просто нужно добавить фиктивный объект в список массивов, а затем просто вызвать notifyDataSetChanged ()

//Step 1 reposition your adapter
        ProductAdapter adapter = new ProductAdapter(this, productList);

        //TODO FAB BUTTON
        FloatingActionButton floatingActionButton =
                (FloatingActionButton) findViewById(R.id.fab);

        floatingActionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //The problem is in the following line you need to pass the values but what you are doing is incorrect
                //Product mProduct = new Product(List spinner, String editText, Boolean checkBox, String textView5);
                //So replace the above line with the following code
            ArrayList<String> spinnerItem = new ArrayList<String>();
            spinnerItem.add("StackOverFlow");
                //There are better and efficient ways to achieve this, If you explain what do you want exaclty I might be able to help
                Product mProduct = new Product(spinnerItem, "EditText Value", true, "TextView Value");
                productList.add(mProduct); //what goes here???//
                if(adapter != null)
                  adapter.notifyDataSetChanged();
                else
                  //Handle the empty adapter here

            }
        });

Думаю, теперь с приведенным выше кодом все готово!

ОБНОВЛЕНИЕ Попробуйте изменить следующий блок кода внутри ProductAdapter.java

  @Override
    public void onBindViewHolder(ProductViewHolder holder, int position) {
        //getting the product of the specified position
        Product product = productList.get(position);

        //binding the data with the viewholder views


        //MyListAdapter adapter = new MyListAdapter(mCtx, R.layout.listrow, R.id.txtid, Product.spinnerItemsList);
        //spinner.setAdapter(adapter);
        //Try using Simple ArrayAdapter if all you need to display is one text
        ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String> (mCtx, android.R.layout.simple_spinner_item, Product.getSpinnerItemsList());
        spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(spinnerArrayAdapter); 
    }
2
Ussaid Iqbal 26 Сен 2018 в 09:37

productList - это список продуктов. Вы должны указать объект типа product при выполнении `productList.add ().

Пример:

floatingActionButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Product p = new Product(...)
        productList.add(p);
        ProductAdapter adapter = new ProductAdapter(this, productList);
        //setting adapter to recyclerview
        recyclerView.setAdapter(adapter);
    }
});

P.s: Первый аргумент в конструкторе Product бесполезен, поскольку вы его нигде не используете.

Есть способы лучше реализовать это.

2
LonelyCpp 25 Сен 2018 в 09:50