Как добавить счетчик к каждому элементу в recyclerview? - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь добавить объект счетчика внутри каждого элемента recyclerview.

Я думаю, проблема в том, что в OnCreate setContentView (R.layout.activity_modify_list2) ссылается на файл xml, который содержит recyclerview:

protected void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_modify_list2);

    initView();
}

Из-за этого метод createSpinner () ищет счетчик в этом файле, а не в файле xml для отдельного элемента recyclerview, что дает ошибку ссылки на нулевой объект:

private Spinner CreateSpinner() {
    Spinner staticSpinner = findViewById(R.id.spinner);
    ... }

Полный java файл для страницы:

public class ModifyListActivity extends Activity {

    private RecyclerView recyclerView;

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

        initView();
    }

    private void initView() {
        recyclerView = (RecyclerView) findViewById(R.id.recyclerViewModifyList);
        createList();
    }

    private void createList() {
        ArrayList<ModifyListPageItem> items = new ArrayList<>();

        ModifyListPageItem item;

        item = new ModifyListPageItem();
        item.setTitle("Resident Evil Games");
        item.setDescription("Ranking all Resident Evil games");
        items.add(item);

        item = new ModifyListPageItem();
        item.setRank("1.");
        item.setSpinner(CreateSpinner());
        items.add(item);

        item = new ModifyListPageItem();
        item.setRank("2.");
        item.setSpinner(CreateSpinner());
        items.add(item);

        item = new ModifyListPageItem();
        item.setRank("3.");
        item.setSpinner(CreateSpinner());
        items.add(item);

        // set adapter
        ModifyListPageAdapter adapter = new ModifyListPageAdapter(this, items);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);
    }

    private Spinner CreateSpinner() {
        Spinner staticSpinner = findViewById(R.id.spinner);

        // Create an ArrayAdapter using the string array and a default spinner
        ArrayAdapter<CharSequence> staticAdapter = ArrayAdapter
                .createFromResource(this, R.array.resident_evil_games,
                        android.R.layout.simple_spinner_item);

        // Specify the layout to use when the list of choices appears
        staticAdapter
                .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        // Apply the adapter to the spinner
        staticSpinner.setAdapter(staticAdapter);

        return staticSpinner;
    }
}

Полный Java файл для адаптера

public class ModifyListPageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private static int TYPE_HEADER = 1;
    private static int TYPE_ITEM = 2;
    private Context context;
    private ArrayList<ModifyListPageItem> items;

    public ModifyListPageAdapter(Context context, ArrayList<ModifyListPageItem> items) {
        this.context = context;
        this.items = items;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view;
        if (viewType == TYPE_HEADER) {
            view = LayoutInflater.from(context).inflate(R.layout.item_modlist_header, parent, false);
            return new HeaderViewHolder(view);
        }
        else {
            view = LayoutInflater.from(context).inflate(R.layout.item_modlist_object, parent, false);
            return new ItemViewHolder(view);
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        if (getItemViewType(position) == TYPE_HEADER)
            ((HeaderViewHolder)holder).SetHeaderDetails(items.get(position));
        else
            ((ItemViewHolder)holder).SetItemDetails(items.get(position));
    }

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

    @Override
    public int getItemViewType(int position) {
        if (TextUtils.isEmpty(items.get(position).getRank())) {
            return TYPE_HEADER;
        }
        else
            return TYPE_ITEM;
    }

    class HeaderViewHolder extends RecyclerView.ViewHolder {

        private TextView txtTitle;
        private TextView txtDescription;

        public HeaderViewHolder(@NonNull View itemView) {
            super(itemView);
            txtTitle = itemView.findViewById(R.id.txtModListTitle);
            txtDescription = itemView.findViewById(R.id.txtModListDescription);
        }

        private void SetHeaderDetails(ModifyListPageItem item) {
            txtTitle.setText(item.getTitle());
            txtDescription.setText(item.getDescription());
        }
    }

    class ItemViewHolder extends RecyclerView.ViewHolder {

        private TextView txtRank;
        private Spinner spinner;

        public ItemViewHolder(@NonNull View itemView) {
            super(itemView);
            txtRank = itemView.findViewById(R.id.modlist_rank);
            spinner = itemView.findViewById(R.id.spinner);
        }

        private void SetItemDetails(ModifyListPageItem item) {
            txtRank.setText(item.getRank());
            spinner.setOnItemClickListener(spinner.getOnItemClickListener());
        }
    }
}

XML файл для страницы layout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ModifyListActivity">

    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/bottom_navigation"
        app:itemBackground="@color/colorPrimary"
        app:itemTextColor="@drawable/selector"
        app:itemIconTint="@drawable/selector"
        app:menu="@menu/menu_navigation"
        android:layout_alignParentBottom="true"
        android:background="@color/colorPrimary"/>

    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/recyclerViewModifyList"/>
</RelativeLayout>

XML Файл для макета элемента recyclerview:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="1dp"
    android:padding="8dp"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/modlist_rank"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:text="1."
        android:textColor="#000000"
        android:textSize="38dp" />

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="20dp" />

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