我在这里用本教程制作了一个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
更多推荐
发布评论