چگونه میتوانیم برای ایتم های ریسایکلر ویو Expandable Textview بسازیم ؟
سلام
من ریسایکلر ویویی دارم که اطلاعاتش از سرور گرفته میشه
برای Textview که در ریسایکلر ویو هست یک expandable درست کردم
اطلاعات از سرور به صورت سه تا سه تا دریافت میشه
سه ایتم اول که لود میشه expandable به درستی کار میکنه اما وقتی ایتم های جدیدتر لود میشن expandable از کار میفته و حتی همون سه ایتم اول هم دیگه کار نمیکنن
به نظرتون مشکل از کجا میتونه باشه؟
کدهایی که برای expandable نوشتم :
ViewTreeObserver vto = holder.des.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
holder.des.getViewTreeObserver().removeOnPreDrawListener(this);
Log.i("_exe_","2");
final int line = holder.des.getLineCount();
Log.i("_exe_","3");
if (line < 2) {
Log.i("_exe_","4");
holder.txt_more.setVisibility(View.INVISIBLE);
}
else if (line > 1) {
Log.i("_exe_","5");
holder.des.setMaxLines(1);
Log.i("divoone","line count is :"+line);
Log.i("_exe_","6");
isopenTextView = false;
Log.i("_exe_","7");
holder.txt_more.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("_exe_","8");
if (!isopenTextView) {
Log.i("_exe_","9");
holder.des.setMaxLines(line);
Log.i("_exe_","10");
isopenTextView = true;
} else if (isopenTextView) {
Log.i("_exe_","11");
holder.des.setMaxLines(1);
Log.i("_exe_","12");
isopenTextView = false;
}
}
});
}
Log.i("_exe_","13");
return true;
}
});
کد های اداپترم :
public class Clip_adapter extends RecyclerView.Adapter<Clip_adapter.CustomViewHolder> {
private List<Clip_object> feedItemList;
private Context mContext;
private Context context;
int lastPosition = -1;
public boolean isopenTextView;
public Clip_adapter(Context context, List<Clip_object> feedItemList) {
this.feedItemList = feedItemList;
this.mContext = context;
}
public void add_new_data(Clip_object obj)
{
feedItemList.add(obj);
notifyDataSetChanged();
}
@Override
public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.clip_page, null);
CustomViewHolder viewHolder = new CustomViewHolder(view, new Clip_adapter.IMyViewHolderClicks() {
public void onPotato(View caller) { Log.i("_REQ_", "Poh-tah-tos"); };
public void onTomato(ImageView callerImage) { Log.i("_REQ_", "To-m8-tohs"); }
});
return viewHolder;
}
@Override
public void onBindViewHolder(final CustomViewHolder holder, final int position) {
final Clip_object feedItem = feedItemList.get(position);
Log.i("_exe_","0");
Log.i("_exe_","1");
ViewTreeObserver vto = holder.des.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
holder.des.getViewTreeObserver().removeOnPreDrawListener(this);
Log.i("_exe_","2");
final int line = holder.des.getLineCount();
Log.i("_exe_","3");
if (line < 2) {
Log.i("_exe_","4");
holder.txt_more.setVisibility(View.INVISIBLE);
}
else if (line > 1) {
Log.i("_exe_","5");
holder.des.setMaxLines(1);
Log.i("divoone","line count is :"+line);
Log.i("_exe_","6");
isopenTextView = false;
Log.i("_exe_","7");
holder.txt_more.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("_exe_","8");
if (!isopenTextView) {
Log.i("_exe_","9");
holder.des.setMaxLines(line);
Log.i("_exe_","10");
isopenTextView = true;
} else if (isopenTextView) {
Log.i("_exe_","11");
holder.des.setMaxLines(1);
Log.i("_exe_","12");
isopenTextView = false;
}
}
});
}
Log.i("_exe_","13");
return true;
}
});
if (!TextUtils.isEmpty(feedItem.getImage_item())) {
Picasso.with(mContext).load(feedItem.getImage_item())
.error(R.drawable.ostaaad)
.placeholder(R.drawable.ostaaad)
.into(holder.imageView);
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Clip_object feedItem1=feedItemList.get(position) ;
Intent view_category_content = new Intent(v.getContext(), Clip_dl.class);
view_category_content.putExtra("EXTRA_ITEM_ID", feedItem1.getId());
view_category_content.putExtra("EXTRA_ITEM_VIDEO", feedItem1.getVideo_item());
v.getContext().startActivity(view_category_content);
}
});
AssetManager am = mContext.getAssets();
Typeface tface=Typeface.createFromAsset(am,"yekan.ttf");
holder.titre.setText(Html.fromHtml(feedItem.getTitre()));
holder.titre.setTypeface(tface);
holder.download.setText(Html.fromHtml(feedItem.getDownload_count()));
holder.download.setTypeface(tface);
holder.like.setText(feedItem.getLike_count());
holder.like.setTypeface(tface);
holder.view_.setText(Html.fromHtml(feedItem.getView_count()));
holder.view_.setTypeface(tface);
holder.comment.setText(Html.fromHtml(feedItem.getComment_count()));
holder.comment.setTypeface(tface);
holder.des.setText(Html.fromHtml(feedItem.getDes()));
holder.des.setTypeface(tface);
}
@Override
public int getItemCount() {
return (null != feedItemList ? feedItemList.size() : 5);
}
class CustomViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public ImageView imageView;
public TextView titre;
public TextView download;
public TextView like;
public TextView view_;
public TextView comment;
private TextView des;
private TextView txt_more;
public IMyViewHolderClicks mListener;
public CustomViewHolder(View view, IMyViewHolderClicks listener) {
super(view);
mListener = listener;
txt_more = (TextView) itemView.findViewById(R.id.txt_toggle);
imageView = (ImageView) view.findViewById(R.id.image_item);
titre = (TextView) view.findViewById(R.id.titre);
download = (TextView) view.findViewById(R.id.download);
like = (TextView) view.findViewById(R.id.like);
view_ = (TextView) view.findViewById(R.id.view);
comment = (TextView) view.findViewById(R.id.comment);
des = (TextView) view.findViewById(R.id.short_des);
}
@Override
public void onClick(View v) {
Log.i("_REQ_","Clicked On Item");
}
}
public interface IMyViewHolderClicks {
public void onPotato(View caller);
public void onTomato(ImageView callerImage);
}
}
با توجه به مشکلاتی که post کردن ویو و یا حتی استفاده از ViewTreeObserver ها در لیست ویو دارن، به نظرم بهتره از هیچ یک استفاده نکنید. برای چیزی که شما میخواید بنویسید راه های زیادی هست.
راه اول:
استفاده از کاستوم تکست ویو. بدین صورت که شما توی خوده تکست ویویی که استفاده میکنید کدهای بالا رو اضافه کنید و زمانی که کلیک میشه باز بشه.
راه دوم:
هندل کردن کلیک به صورت دستی و استفاده از انیمیشن برای باز و بسته کردن تکست ویو.
این روش ممکنه زیباترین راه باشه ولی پیچیدگی های خودش رو هم داره که یک نمونش اینه که باید فلگ هایی ست کنید که کدوم ویو بازه و کدوم بسته و کدوم در حال باز شدن و در چه استیتی هست.
راه حل سوم:
با کلیک روی تکست ویو، مکس لاین رو تغییر بدید و ویو رو نوتیفای کنید که فکر کنم راحت ترین راهه ولی خیلی زیبا نمیشه.
راه چهارم:
استفاده از کتابخانه های آماده که بسیار زیاد هستن
راه پنجم که نمیدونم چقدر جواب بده:
به جای استفاده از ViewTreeObserver میتونید ویو رو post کنید چون فقط یه تسک ویو (اگر اشتباه نکنم) هست.
موفق باشید
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .