تغییر نکردن شکل ویو در لیست ویو هنگام اسکرول کردن( حل شد)
سلام
من آموزش استاد رو دیدم ولی شکل کد من کمی فرق داره ،فرقش هم اینکه متد fill رو نذاشتم و مستقیم در متد getView دستوراتم رو گذاشتم. و البته فرق های دیگه هم داره که کد رو میذارم که ببینید.
قبلش هم یه توضیح بدم که من در کنار هر خبری یه ستاره گذاشتم که کاربر اگر روش بزنه ستاره تغییر رنگ بده و جز برگزیده ها بشه.
همه کارا درست پیش میره جز اینکه مثلا وقتی روی ستاره خبر یک تاچ میکنم تغییر رنگ میده و باقی کارا ولی زمانی که به سمت پایین اسکرول میکنم و دوباره به سمت بالا اسکرول میکنم و خبر یک رو میبینم که ستارش تغییری نکرده !
آیا متد fill ضرورت داره که باشه؟
اکثر جاهایی که نگاه کردم استفاده نکردن دیگه نمیدونم. بنظرم هم درست کار کردم ولی انگار اشتباه فکر میکنم
کد قسمت آداپتر رو میذارم ببینید ممنون میشم نظرتون رو بگین.
public class CustomListAdapterMessage1 extends BaseAdapter {
Database db;
Context mContext;
private List<UpdateMessage> messages = null;
private ArrayList<UpdateMessage> arraylist;
private int Star = 1;
private boolean boolStar = false;
private int lastPosition = -1;
public CustomListAdapterMessage1(Context fragmentNews, List<UpdateMessage> messages) {
this.mContext = fragmentNews;
this.messages = messages;
this.arraylist = new ArrayList<UpdateMessage>();
this.arraylist.addAll(messages);
}
private static class ViewHolder {
public TextView txtTitle;
public TextView txtDescription;
public TextView textViewTypeVdate;
public TextView textDate;
public ImageView imageViewStar;
public LinearLayout layout_main;
public LinearLayout layout_News;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
db = new Database(G.context);
final ViewHolder holder;
final View result;
if (convertView == null) {
// convertView = G.inflater.inflate(R.layout.layout_row, parent, false);
convertView = G.inflater.inflate(R.layout.layout_row, null);
holder = new ViewHolder();
holder.txtTitle = (TextView) convertView.findViewById(R.id.textViewTitr);
holder.txtDescription = (TextView) convertView.findViewById(R.id.textViewMatn);
holder.textViewTypeVdate = (TextView) convertView.findViewById(R.id.textViewTypeVdate);
holder.textDate = (TextView) convertView.findViewById(R.id.textViewDate);
holder.imageViewStar = (ImageView) convertView.findViewById(R.id.imageViewStar);
holder.layout_main = (LinearLayout) convertView.findViewById(R.id.layout_main);
holder.layout_News = (LinearLayout) convertView.findViewById(R.id.layoutNews);
convertView.setTag(holder);
result = convertView;
} else {
holder = (ViewHolder) convertView.getTag();
result = convertView;
}
Animation animation = AnimationUtils.loadAnimation(mContext, (position > lastPosition) ? R.anim.up_from_bottom : R.anim.down_from_top);
result.startAnimation(animation);
lastPosition = position;
Star = messages.get(position).getStar();
if(Star == 1){
holder.imageViewStar.setImageResource(R.drawable.starempty);
boolStar = false;
} else if(Star == 2){
holder.imageViewStar.setImageResource(R.drawable.starfilled);
boolStar = true;
}
holder.textViewTypeVdate.setText(messages.get(position).getMessage_Type());
holder.txtTitle.setText(messages.get(position).getMessase_Title());
if (messages.get(position).getMessage_Text().length() > 25) {
holder.txtDescription.setText(messages.get(position).getMessage_Text().substring(0, 25) + "...");
} else {
holder.txtDescription.setText(messages.get(position).getMessage_Text());
}
holder.textDate.setText(messages.get(position).getCreation_Date());
holder.imageViewStar.setOnClickListener(new View.OnClickListener() { ** این قسمت ستاره کردن هر خبر **
@Override
public void onClick(View v) {
int Message_ID = messages.get(position).getMessage_ID();
String TypeMes = messages.get(position).getMessage_Type();
String titr = messages.get(position).getMessase_Title();
String Text = messages.get(position).getMessage_Text();
String date = messages.get(position).getCreation_Date();
int Is_Emergency = messages.get(position).getIs_Emergency();
Star = messages.get(position).getStar();
if(boolStar == false){
holder.imageViewStar.setImageResource(R.drawable.starfilled);
Star = 2;
boolStar = true;
UpdateMessage updateMessage = new UpdateMessage(0,0,"","","","",0,0);
updateMessage.Message_Type = TypeMes;
updateMessage.Messase_Title = titr;
updateMessage.Message_Text = Text;
updateMessage.Creation_Date = date;
updateMessage.Is_Emergency = Is_Emergency;
updateMessage.Star = 2;
boolean result = db.updateStar(updateMessage,Message_ID);
if(result){
Toast.makeText(mContext, "تغییر به دو", Toast.LENGTH_SHORT).show();
} else { }
} else if(boolStar == true){
holder.imageViewStar.setImageResource(R.drawable.starempty);
Star = 1;
boolStar = false;
UpdateMessage updateMessage = new UpdateMessage(0,0,"","","","",0,0);
updateMessage.Message_Type = TypeMes;
updateMessage.Messase_Title = titr;
updateMessage.Message_Text = Text;
updateMessage.Creation_Date = date;
updateMessage.Is_Emergency = Is_Emergency;
updateMessage.Star = 1;
boolean result = db.updateStar(updateMessage,Message_ID);
if(result){
Toast.makeText(mContext, "تغییر به یک", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(mContext, "no", Toast.LENGTH_SHORT).show();
}
}
}
});
holder.layout_main.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
int Message_ID = messages.get(position).getMessage_ID();
String TypeMes = messages.get(position).getMessage_Type();
String titr = messages.get(position).getMessase_Title();
String Text = messages.get(position).getMessage_Text();
String date = messages.get(position).getCreation_Date();
int Is_Emergency = messages.get(position).getIs_Emergency();
Intent intent = new Intent(G.context, ActivityNews.class);
intent.putExtra("Message_ID", Message_ID);
intent.putExtra("Type", TypeMes);
intent.putExtra("Titr", titr);
intent.putExtra("Text", Text);
intent.putExtra("Date", date);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
G.context.startActivity(intent);
}
});
holder.layout_News.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
arraylist.remove(messages.get(position));
return false;
}
});
return convertView;
}
///////////////////////////////// متدی برای جستجو
public void filterNews(String charText) {
charText = charText.toLowerCase(Locale.getDefault());
messages.clear();
if (charText.length() == 0) {
messages.addAll(arraylist);
} else {
for (UpdateMessage wp: arraylist) {
if (wp.getMessage_Type().toLowerCase(Locale.getDefault()).contains(charText)) {
messages.add(wp);
}
}
}
notifyDataSetChanged();
}
@Override
public int getCount() {
return messages.size();
}
@Override
public UpdateMessage getItem(int position) {
return messages.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
}
سلام ، من قبلا آموزش لیست ویوی استاد رو چندین بار نگاه کردم تا آخر تونستم 95% درکش کنم و تقریبا کامل بهش مسلط شده بودم ، ولی الان ترتیب و زمان اجرا شدن کدها باز برام پیچیده شده البته میتونم از کدها کامل استفاده کنم ونیازمو رفع کنم . الانم نمیدونم میتونم کمک کنم یا نه :
جای این کدها در متد getView نیست :
holder.txtTitle = (TextView) convertView.findViewById(R.id.textViewTitr);
holder.txtDescription = (TextView) convertView.findViewById(R.id.textViewMatn);
holder.textViewTypeVdate = (TextView) convertView.findViewById(R.id.textViewTypeVdate);
holder.textDate = (TextView) convertView.findViewById(R.id.textViewDate);
holder.imageViewStar = (ImageView) convertView.findViewById(R.id.imageViewStar);
holder.layout_main = (LinearLayout) convertView.findViewById(R.id.layout_main);
holder.layout_News = (LinearLayout) convertView.findViewById(R.id.layoutNews);
یک costructor برای کلاس ViewHolder درست کن و در اونجا مقدار دهی کن .
متد fill رو در کلاس ViewHolder تعریف کن :
public void fill(UpdateMessage item,int position){
}
حالا تمام کدهای این خط :
Star = messages.get(position).getStar();
تا آخر ( تا قبل از return convertView ) رو ببر داخل متد fill
و قبل از return convertView متد fill رو صدا بزن :
holder.fill(getItem(position),position);
لیست ویو خیلی پیچیده ست ، نمیدونم ببین با این کارا درست میشه ، تست کن . این ساختاری که گفتم ساختار لیست ویوی استاده .
سلام.
لیست ویو شما قراره که داده های موجود در messages رو نشون بده(لیست ویو به یه منبع داده که توی کدای شما همون messages هستش وصله)،حالا شما توی کدتون،وقتی روی imageViewStar کلیک می کنید،مقدار برگزیده بودن یا نبودن رو فقط توی دیتابیستون تغییر میدین،اما لیست ویو در حال حاضر داره داده های موجود در messages رو نشون میده و دوباره داده های جدید از دیتابیس خونده نمیشه که بتونه مقداری که توسط شما تغییر کرده بود رو تشخیص بده ===> پس شما باید علاوه بر تغییر این مقدار توی دیتابیس،این مقدارو توی لیست messages هم تغییر بدین.
یعنی باید علاوه بر getStar یه متد setStar هم داشته باشین که بعد از دستور db.updateStar باید این متد رو هم صدا بزنید تا مقدار ستاره دار بودن یا نبودن رو توی لیست messages،برای اون آیتم فعلی تغییر بدین.messages.get(position).setStar
متد setStar :
public void setStar(int star){
//...
}
بعد از تعریف این متد کد زیر رو جایگزین کد خودتون کنید :
holder.imageViewStar.setOnClickListener(new View.OnClickListener() { ** این قسمت ستاره کردن هر خبر **
@Override
public void onClick(View v) {
int Message_ID = messages.get(position).getMessage_ID();
String TypeMes = messages.get(position).getMessage_Type();
String titr = messages.get(position).getMessase_Title();
String Text = messages.get(position).getMessage_Text();
String date = messages.get(position).getCreation_Date();
int Is_Emergency = messages.get(position).getIs_Emergency();
Star = messages.get(position).getStar();
if(boolStar == false){
holder.imageViewStar.setImageResource(R.drawable.starfilled);
Star = 2;
boolStar = true;
UpdateMessage updateMessage = new UpdateMessage(0,0,"","","","",0,0);
updateMessage.Message_Type = TypeMes;
updateMessage.Messase_Title = titr;
updateMessage.Message_Text = Text;
updateMessage.Creation_Date = date;
updateMessage.Is_Emergency = Is_Emergency;
updateMessage.Star = 2;
boolean result = db.updateStar(updateMessage,Message_ID);
messages.get(position).setStar(Star); // شما این دستور رو ننوشتین
if(result){
Toast.makeText(mContext, "تغییر به دو", Toast.LENGTH_SHORT).show();
} else { }
} else if(boolStar == true){
holder.imageViewStar.setImageResource(R.drawable.starempty);
Star = 1;
boolStar = false;
UpdateMessage updateMessage = new UpdateMessage(0,0,"","","","",0,0);
updateMessage.Message_Type = TypeMes;
updateMessage.Messase_Title = titr;
updateMessage.Message_Text = Text;
updateMessage.Creation_Date = date;
updateMessage.Is_Emergency = Is_Emergency;
updateMessage.Star = 1;
boolean result = db.updateStar(updateMessage,Message_ID);
messages.get(position).setStar(Star); // شما این دستور رو ننوشتین
if(result){
Toast.makeText(mContext, "تغییر به یک", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(mContext, "no", Toast.LENGTH_SHORT).show();
}
}
}
});
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .