有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

RecyclerView中存在多个对象的java错误

我在这里用这个教程做了一个回收视图。使用一个对象(一行)时,一切正常。添加第二行后,我的布局被完全破坏,只显示第一个对象。有没有人知道答案

这是一行(所有看起来都应该像这行):

enter image description here

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

enter image description here

这是我创建对象的片段:

@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() == 安卓.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() == 安卓.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:安卓="http://schemas.安卓.com/apk/res/安卓" 安卓:layout_height="match_parent" 安卓:layout_width="match_parent" 安卓:focusable="true" 安卓:paddingLeft="@dimen/activity_horizontal_margin" 安卓:paddingRight="@dimen/activity_horizontal_margin" 安卓:clickable="true" 安卓:background="?安卓:attr/selectableItemBackground" 安卓:orientation="vertical"> <!-- Setting icon --> <ImageView 安卓:id="@+id/settingImage" 安卓:layout_width="24dp" 安卓:layout_height="24dp" 安卓:layout_centerVertical="true" 安卓:layout_alignParentStart="true" 安卓:layout_marginRight="8dp" 安卓:layout_marginTop="1dp" 安卓:layout_marginBottom="1dp" 安卓:contentDescription="Icon" 安卓:src="@drawable/my_icon" /> <!-- Setting title --> <TextView 安卓:id="@+id/settingTitle" 安卓:textColor="@color/colorBlack" 安卓:layout_width="match_parent" 安卓:layout_marginLeft="40dp" 安卓:layout_marginTop="14dp" 安卓:textSize="16dp" 安卓:layout_height="wrap_content" /> <!-- Setting subtitle --> <TextView 安卓:id="@+id/settingSubtitle" 安卓:layout_below="@id/settingTitle" 安卓:layout_marginBottom="14dp" 安卓:layout_marginLeft="40dp" 安卓:layout_width="match_parent" 安卓:layout_height="wrap_content" /> </RelativeLayout>

共 (1) 个答案

  1. # 1 楼答案

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

    尝试在设置列表行中为Relativelayout设置android:layout_height="wrap_content"。xml