Reputation: 552
I have a RecyclerView in my app, which gets filled up by my listadapter. But some elements gets lost after scrolling or even don't get shown at the start. Here I call the ListAdapter in my Activity:
ListAdapter adapter = new ListAdapter(posts, new View.OnClickListener() {
@Override
public void onClick(final View v) {
new Thread(new Runnable() {
@Override
public void run() {
final PostViewHolder holder = new PostViewHolder(v);
final Intent intent = new Intent(MainActivity.this, PostViewActivity.class);
intent.setAction(Intent.ACTION_SEND);
intent.setType("image/png");
final int type = Integer.parseInt((String) holder.cardView.getTag(R.string.ident_type));
Log.e("TYPE", "" + type);
final String username = (String) holder.cardView.getTag(R.string.ident_username);
if (type == 2) {
holder.imagePost.setTransitionName(getString(R.string.transition_image));
PostViewActivity post;
int postWidth = 0;
int postHeight = 0;
postWidth = holder.imagePost.getWidth();
postHeight = holder.imagePost.getHeight();
Drawable drawable = holder.imagePost.getDrawable();
Bitmap photo = ((BitmapDrawable) drawable).getBitmap();
String path = MediaStore.Images.Media.insertImage(getContentResolver(), photo, "pic", null);
Uri uri = Uri.parse(path);
intent.putExtra(Intent.EXTRA_STREAM, uri);
intent.putExtra("dim", postWidth + "/" + postHeight);
} else {
}
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
ActivityOptionsCompat options;
Pair<View, String> imagePair;
if (type == 2) {
imagePair = Pair.create((View) holder.imagePost, getString(R.string.transition_image));
options = ActivityOptionsCompat.makeSceneTransitionAnimation(MainActivity.this, imagePair);
} else {
options = ActivityOptionsCompat.makeSceneTransitionAnimation(MainActivity.this);
}
String id = (String) holder.cardView.getTag(R.string.ident_id);
intent.putExtra("type", type);
intent.putExtra("username", username);
intent.putExtra("id", id);
startActivity(intent, options.toBundle());
}
});
}
}).start();
}
}, width, height, context, activity);
RecyclerView rv = (RecyclerView) findViewById(R.id.user_interface_recycler);
StaggeredGridLayoutManager lm = new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL);
rv.setLayoutManager(lm);
rv.setAdapter(adapter);
And here is the listadapter itself:
public class ListAdapter extends RecyclerView.Adapter<ListAdapter.PostViewHolder> {
List<Post> posts;
View.OnClickListener listener;
int width;
int height;
private Context context;
public static final String URL = "http://" + Connection.HOSTNAME + "/story/images/";
MainActivity activity;
public ListAdapter(List<Post> posts, View.OnClickListener listener, int width, int height, Context context, MainActivity activity) {
this.posts = posts;
this.listener = listener;
this.width = width;
this.height = height;
this.context = context;
this.activity = activity;
}
int placeholder = 0;
@Override
public int getItemCount() {
return posts.size();
}
@Override
public PostViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.insert_layout, viewGroup, false);
PostViewHolder pvh = new PostViewHolder(v);
return pvh;
}
@Override
public void onBindViewHolder(final PostViewHolder postViewHolder, int i) {
Log.e("NUMBER" + i, posts.get(i).getType()+"");
switch (posts.get(i).getType()) {
case 1:
postViewHolder.layoutPhoto.setVisibility(View.GONE);
textPost(postViewHolder, i);
break;
case 2:
postViewHolder.layoutText.setVisibility(View.GONE);
imagePost(postViewHolder, i);
break;
}
}
private void imagePost(final PostViewHolder postViewHolder, final int i) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
new Thread(new Runnable() {
@Override
public void run() {
String mainText = posts.get(i).getText();
if (mainText.length() > 100 && posts.get(i).getType() == 2) {
mainText = mainText.substring(0, 100);
mainText += "(...)";
}
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(posts.get(i).getTime());
if (posts.get(i).getTime() > MainActivity.minTime) {
MainActivity.minTime = posts.get(i).getTime();
}
int mYear = calendar.get(Calendar.YEAR);
int mMonth = calendar.get(Calendar.MONTH);
int mDay = calendar.get(Calendar.DAY_OF_MONTH);
int mMin = calendar.get(Calendar.MINUTE);
int mHour = calendar.get(Calendar.HOUR);
String mmin;
if (mMin < 10) {
mmin = 0 + "" + mMin;
} else {
mmin = Integer.toString(mMin);
}
String mhour;
if (mHour < 10) {
mhour = 0 + "" + mHour;
} else {
mhour = Integer.toString(mHour);
}
String resultdate = mDay + "." + (mMonth + 1) + "." + mYear + " " + mhour + ":" + mmin;
String storyName = posts.get(i).getStory().getName();
String insertText = posts.get(i).getText() + " by " + posts.get(i).getUsername() + "\n" + resultdate + "\n " + storyName;
final Spannable spannable = new SpannableString(insertText);
spannable.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.colorAccent)), (posts.get(i).getText() + " by ").length(), insertText.length() - resultdate.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.colorDezent)), posts.get(i).getText().length(), (posts.get(i).getText() + " by ").length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(new RelativeSizeSpan(1f), (posts.get(i).getText() + " by " + posts.get(i).getUsername() + "\n").length(), insertText.length() - storyName.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.colorDezent)), (posts.get(i).getText() + " by " + posts.get(i).getUsername() + "\n").length(), insertText.length() - storyName.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.colorPrimaryDark)), insertText.length() - storyName.length(), insertText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
Log.e("photo", "photo");
postViewHolder.cv.setTag(R.string.ident_type, Integer.toString(posts.get(i).getType()));
postViewHolder.cv.setTag(R.string.ident_id, Integer.toString(posts.get(i).getID()));
int imgWidth = (int) ((float) width / 6);
int imgHeight = (int) ((float) width / 6);
Picasso.with(context).load(ListAdapter.URL + posts.get(i).getImageUser() + ".png").transform(new CircleTransform()).resize(imgWidth, imgHeight).centerCrop().into(postViewHolder.photoUserPhoto);
Picasso.with(context).load(ListAdapter.URL + posts.get(i).getImagePost() + ".png").resize(width, 500).centerCrop().into(postViewHolder.photoPostPhoto);
postViewHolder.photoText.setText(spannable);
postViewHolder.photoPostPhoto.setTransitionName("");
postViewHolder.itemView.setOnClickListener(listener);
postViewHolder.cv.setTag(R.string.ident_username, posts.get(i).getUsername());
}
});
}
}
).start();
}
private void textPost(final PostViewHolder postViewHolder, final int i) {
new Thread(new Runnable() {
@Override
public void run() {
String mainText = posts.get(i).getText();
Long postdate = posts.get(i).getTime();
String username = posts.get(i).getUsername();
//Bitmap userPhoto = posts.get(i).getImageUser();
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(posts.get(i).getTime());
if (posts.get(i).getTime() > MainActivity.minTime) {
MainActivity.minTime = posts.get(i).getTime();
}
int mYear = calendar.get(Calendar.YEAR);
int mMonth = calendar.get(Calendar.MONTH);
int mDay = calendar.get(Calendar.DAY_OF_MONTH);
int mMin = calendar.get(Calendar.MINUTE);
int mHour = calendar.get(Calendar.HOUR);
String mmin;
if (mMin < 10) {
mmin = 0 + "" + mMin;
} else {
mmin = Integer.toString(mMin);
}
String mhour;
if (mHour < 10) {
mhour = 0 + "" + mHour;
} else {
mhour = Integer.toString(mHour);
}
String resultdate = mDay + "." + (mMonth + 1) + "." + mYear + " " + mhour + ":" + mmin;
String storyName = posts.get(i).getStory().getName();
String insertText = posts.get(i).getText() + " by " + posts.get(i).getUsername() + "\n" + resultdate + "\n " + storyName;
final Spannable spannable = new SpannableString(insertText);
spannable.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.colorAccent)), (posts.get(i).getText() + " by ").length(), insertText.length() - resultdate.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.colorDezent)), posts.get(i).getText().length(), (posts.get(i).getText() + " by ").length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(new RelativeSizeSpan(0.8f), (posts.get(i).getText() + " by " + posts.get(i).getUsername() + "\n").length(), insertText.length() - storyName.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.colorDezent)), (posts.get(i).getText() + " by " + posts.get(i).getUsername() + "\n").length(), insertText.length() - storyName.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.colorPrimaryDark)), insertText.length() - storyName.length(), insertText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
Log.e("text", "text");
postViewHolder.textUser.setText(spannable);
int imgWidth = (int) ((float) width / 6);
int imgHeight = (int) ((float) width / 6);
Picasso.with(context).load(ListAdapter.URL + posts.get(i).getImageUser() + ".png").transform(new CircleTransform()).resize(imgWidth, imgHeight).centerCrop().into(postViewHolder.textUserPhoto);
postViewHolder.itemView.setOnClickListener(listener);
postViewHolder.cv.setTag(R.string.ident_type, Integer.toString(posts.get(i).getType()));
postViewHolder.cv.setTag(R.string.ident_id, Integer.toString(posts.get(i).getID()));
postViewHolder.cv.setTag(R.string.ident_username, posts.get(i).getUsername());
}
});
}
}).start();
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
public class PostViewHolder extends RecyclerView.ViewHolder {
CardView cv;
LinearLayout layoutPhoto;
TextView photoText;
ImageView photoPostPhoto;
ImageView photoUserPhoto;
LinearLayout layoutText;
TextView textUser;
ImageView textUserPhoto;
PostViewHolder(View itemView) {
super(itemView);
cv = (CardView) itemView.findViewById(R.id.cv);
photoText = (TextView) itemView.findViewById(R.id.photo_user_text);
photoPostPhoto = (ImageView) itemView.findViewById(R.id.photo_postPhoto);
layoutPhoto = (LinearLayout) itemView.findViewById(R.id.insert_layout_photo);
photoUserPhoto = (ImageView) itemView.findViewById(R.id.photo_username_photo);
layoutText = (LinearLayout) itemView.findViewById(R.id.insert_layout_text);
textUser = (TextView) itemView.findViewById(R.id.text_user_text);
textUserPhoto = (ImageView) itemView.findViewById(R.id.text_username_photo);
}
}
}
Where could the problem be? Thanks!
Edit:
fragment_main:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/activity_main_swipe_refresh_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.RecyclerView
android:id="@+id/post_list"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</android.support.v7.widget.RecyclerView>
</android.support.v4.widget.SwipeRefreshLayout>
activity_main (This is a coordinatorLayout, but this gets cut away. Don't know why):
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/appbar_padding_top"
android:theme="@style/AppTheme.AppBarOverlay">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"
app:layout_scrollFlags="scroll|enterAlways|snap">
</android.support.v7.widget.Toolbar>
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="@dimen/fab_margin"
android:src="@android:drawable/ic_dialog_email" />
Upvotes: 0
Views: 228
Reputation: 1274
in onBindViewHolder you set part of the view to GONE. You should make sure all necessary parts are VISIBLE. Try this (constants are good for readability in switch blocks like that, especially as they get bigger):
private static final int TEXT_POST = 1;
private static final int IMAGE_POST = 2;
@Override
public void onBindViewHolder(final PostViewHolder postViewHolder, int i) {
Log.e("NUMBER" + i, posts.get(i).getType()+"");
switch (posts.get(i).getType()) {
case TEXT_POST:
postViewHolder.layoutText.setVisibility(View.VISIBLE);
postViewHolder.layoutPhoto.setVisibility(View.GONE);
textPost(postViewHolder, i);
break;
case IMAGE_POST:
postViewHolder.layoutText.setVisibility(View.GONE);
postViewHolder.layoutPhoto.setVisibility(View.VISIBLE);
imagePost(postViewHolder, i);
break;
default:
// probably unnecessary
postViewHolder.layoutText.setVisibility(View.VISIBLE);
postViewHolder.layoutPhoto.setVisibility(View.VISIBLE);
}
}
Upvotes: 1
Reputation: 1536
Use the latest recyclerview version in your dependencies, then use "wrap_content" as its height in xml file
Upvotes: 0