RecyclerView中有多个对象出错(Error with multiple objects in RecyclerView)

编程入门 行业动态 更新时间:2024-10-25 09:34:54
RecyclerView中有多个对象出错(Error with multiple objects in RecyclerView)

我在这里用本教程制作了一个RecyclerView。 一个对象(一行)都可以正常工作。 添加第二行后,我的布局被完全销毁,只显示第一个对象。 有人知道回答吗?

这是一行(All应该看起来像这一行):

这应该像第一行一样:

这是我创建对象的片段:

@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> 
  
 

I've made a RecyclerView with this tutorial here. All is working fine with one object (one line). After adding a second line my layout is completely destroyed and just the first object is shown. Is there someone who knows an answere?

This is one line (All should looks like this line):

This should be another line like the first one:

This is my fragment where I create the objects:

@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();
} 
  
 

This is my adapter:

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();
    }

} 
  
 

This is my 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;
    }

} 
  
 

This is my xml where I define the rows:

<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"

Since the height of the item is match_parent. it tries to take whole screen and push other items away.

try setting android:layout_height="wrap_content" for Relativelayout in settings_list_row.xml

更多推荐

本文发布于:2023-07-30 06:12:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1336718.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:多个   中有   对象   RecyclerView   multiple

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!