RecyclerView中存在多个对象的java错误
我在这里用这个教程做了一个回收视图。使用一个对象(一行)时,一切正常。添加第二行后,我的布局被完全破坏,只显示第一个对象。有没有人知道答案
这是一行(所有看起来都应该像这行):
这应该是与第一行类似的另一行:
这是我创建对象的片段:
@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 楼答案
因为项目的高度是
match_parent
。它试图占据整个屏幕,并将其他项目推开尝试在设置列表行中为
Relativelayout
设置android:layout_height="wrap_content"
。xml