java - RecyclerView 中多个对象出现错误

标签 java android

我在这里用本教程制作了一个 RecyclerView。 一个对象(一行)一切正常。添加第二行后,我的布局被完全破坏,只显示第一个对象。有知道的人解答一下吗?

这是一行(所有内容都应该类似于这一行):

enter image description here

这应该是与第一行类似的另一行:

enter image description here

这是我创建对象的 fragment :

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view  =  inflater.inflate(R.layout.fragment_settings, container, false);

    accountRecyclerView = (RecyclerView) view.findViewById(R.id.account_recycler_view);

    aAdapter = new SettingsAdapter(settingList);
    RecyclerView.LayoutManager aLayoutManager = new LinearLayoutManager(getActivity().getApplicationContext()) {
        // Disable scrolling in the RecyclerView
        @Override
        public boolean canScrollVertically() {
            return false;
        }
    };

    // Setup account RecyclerView
    accountRecyclerView.setLayoutManager(aLayoutManager);
    accountRecyclerView.setItemAnimator(new DefaultItemAnimator());
    accountRecyclerView.setAdapter(aAdapter);

    prepareAccountData();

    return view;
}

private void prepareAccountData() {
    // Create new setting
    Settings setting = new Settings(1, R.drawable.ic_menu_logout, "Abmelden", "Deine Daten bleibe erhalten");
    // Add Object to list
    settingList.add(setting);

    setting = new Settings(2, R.drawable.ic_menu_logout, "Testadd", "Some text");
    settingList.add(setting);

    // Notify data changes
    aAdapter.notifyDataSetChanged();
}

这是我的适配器:

public class SettingsAdapter extends RecyclerView.Adapter<SettingsAdapter.MySettingHolder> {

    private List<Settings> settingList;
    private Context context;

    public class MySettingHolder extends RecyclerView.ViewHolder {

        public int type;
        public ImageView settingImage;
        public TextView settingTitle, settingSubtitle;

        public MySettingHolder(View view) {
            super(view);
            settingImage = (ImageView) view.findViewById(R.id.settingImage);
            settingTitle = (TextView) view.findViewById(R.id.settingTitle);
            settingSubtitle = (TextView) view.findViewById(R.id.settingSubtitle);
        }
    }

    public SettingsAdapter(Context context) {
        this.context = context;
    }

    public SettingsAdapter(List<Settings> settingList) {
        this.settingList = settingList;
    }

    @Override
    public MySettingHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.settings_list_row, parent, false);

        return new MySettingHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MySettingHolder holder, int position) {
        // Setting for one entry
        final Settings setting = settingList.get(position);
        //RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);

        holder.settingImage.setImageResource(setting.getSettingImageUrl());
        // If the settingSubtitle is empty it should be not visible and just the settingTitle
        if (setting.getSettingSubtitle().equals("")) {
            //params.setMargins(0, 18, 0, 18);
            //holder.settingTitle.setLayoutParams(params);
            holder.settingTitle.setText(setting.getSettingTitle());
            holder.settingSubtitle.setVisibility(View.GONE);
        } else {
            //params.setMargins(0, 18, 0, 18);
            //holder.settingTitle.setLayoutParams(params);
            //params.setMargins(0, 0, 0, 18);
            //holder.settingSubtitle.setLayoutParams(params);
            holder.settingTitle.setText(setting.getSettingTitle());
            holder.settingSubtitle.setText(setting.getSettingSubtitle());
        }

        // Get setting holder type
        holder.type = setting.getType();

        // OnTouchListener for holder/vector color change
        holder.itemView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // Define setting holder
                MySettingHolder holder = (MySettingHolder) (v.getTag());

                // ImageView for changing color
                ImageView imageView = (ImageView) v.findViewById(R.id.settingImage);

                // Detect if user touch or not
                if (event.getAction() == android.view.MotionEvent.ACTION_DOWN) {
                    // Change ImageView color to primary color
                    DrawableCompat.setTint(imageView.getDrawable(), ContextCompat.getColor(v.getContext(), R.color.colorPrimary));
                } else if (event.getAction() == android.view.MotionEvent.ACTION_UP) {
                    // Change ImageView color to primary color
                    DrawableCompat.setTint(imageView.getDrawable(), ContextCompat.getColor(v.getContext(), R.color.iconGray));
                }

                return false;
            }
        });

        // OnClickListener for holder
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(final View v) {
                // Define setting holder
                MySettingHolder holder = (MySettingHolder) (v.getTag());

                // Define switch for line
                switch (holder.type) {
                    // Case 1 = Logout
                    case 1:
                        // OnCLickListener for an event
                        DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                switch (which) {

                                    // Case user types Yes
                                    case DialogInterface.BUTTON_POSITIVE:
                                        // Deleting shared preferences for login activity
                                        SharedPreferences loginPreferences = v.getRootView().getContext().getSharedPreferences("loginPrefs", Context.MODE_PRIVATE);
                                        SharedPreferences.Editor editor = loginPreferences.edit();
                                        editor.clear();
                                        editor.commit();

                                        // Start new acitivity for login
                                        v.getContext().startActivity(new Intent(v.getContext(), LoginActivity.class));

                                        // Exit activity
                                        ((Activity)v.getContext()).finish();

                                        // Exit case button positive/yes
                                        break;

                                    case DialogInterface.BUTTON_NEGATIVE:
                                        // Dismiss dialog
                                        dialog.dismiss();

                                        // Exit case button negative/no
                                        break;
                                }
                            }
                        };
                        // AlertDialog for logout check
                        AlertDialog.Builder builder = new AlertDialog.Builder(v.getRootView().getContext());
                        builder.setMessage("Möchtest du dich wirklich abmelden?")
                                .setPositiveButton("Ja", dialogClickListener)
                                .setNegativeButton("Nein", dialogClickListener)
                                .show();

                        // Exit switch
                        break;

                    case 2:
                        // do other stuff
                        break;

                    default:

                        break;
                }
            }
        });

        holder.itemView.setTag(holder);
    }

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

}

这是我的 setter / getter :

public class Settings {
    private String settingTitle, settingSubtitle;
    private int settingImageUrl;
    private int type;

    public Settings(int type, int settingImageUrl, String settingTitle, String settingSubtitle) {
        this.type = type;
        this.settingImageUrl = settingImageUrl;
        this.settingTitle = settingTitle;
        this.settingSubtitle = settingSubtitle;
    }

    public void setSettingImage(int settingImageUrl) {
        this.settingImageUrl = settingImageUrl;
    }

    public int getSettingImageUrl() {
        return settingImageUrl;
    }

    public void setSettingTitle(String settingTitle) {
        this.settingTitle = settingTitle;
    }

    public String getSettingTitle() {
        return settingTitle;
    }

    public void setSettingSubtitle(String settingSubtitle) {
        this.settingSubtitle = settingSubtitle;
    }

    public String getSettingSubtitle() {
        return settingSubtitle;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

}

这是我定义行的 xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:focusable="true"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:clickable="true"
    android:background="?android:attr/selectableItemBackground"
    android:orientation="vertical">

    <!-- Setting icon -->
    <ImageView
        android:id="@+id/settingImage"
        android:layout_width="24dp"
        android:layout_height="24dp"
        android:layout_centerVertical="true"
        android:layout_alignParentStart="true"
        android:layout_marginRight="8dp"
        android:layout_marginTop="1dp"
        android:layout_marginBottom="1dp"
        android:contentDescription="Icon"
        android:src="@drawable/my_icon" />

    <!-- Setting title -->
    <TextView
        android:id="@+id/settingTitle"
        android:textColor="@color/colorBlack"
        android:layout_width="match_parent"
        android:layout_marginLeft="40dp"
        android:layout_marginTop="14dp"
        android:textSize="16dp"
        android:layout_height="wrap_content" />

    <!-- Setting subtitle -->
    <TextView
        android:id="@+id/settingSubtitle"
        android:layout_below="@id/settingTitle"
        android:layout_marginBottom="14dp"
        android:layout_marginLeft="40dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</RelativeLayout>

最佳答案

因为项目的高度是match_parent。它试图占据整个屏幕并将其他项目推开。

尝试在settings_list_row.xml中为Relativelayout设置android:layout_height="wrap_content"

关于java - RecyclerView 中多个对象出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41813877/

相关文章:

java - Hibernate 在级联所有保存时不生成子 ID

android - 从导航的深层链接调用我的应用程序会导致我的 fragment 被多次实例化

java - 安装 Neo4j REST 服务器插件

java - 从 Java 调用 .js 文件中的 JavaScript 函数

java - 通过xpath获取webelement的文本

android - 获取 Android GpsLocationProvider 对象

android - 如何在 LinearLayout 中对齐 View

java - 在流式传输 URL 时获取 Android VideoView 收到的数据包的访问权限

android - setOnCreateContextMenuListener在RecycleView OnBindViewHolder中不起作用

java - 打开卡片 View 时如何获取特定用户的数据