آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

تغییر نکردن شکل ویو در لیست ویو هنگام اسکرول کردن( حل شد)

mosafer  9 سال پیش  9 سال پیش
0 0

سلام

من آموزش استاد رو دیدم ولی شکل کد من کمی فرق داره ،فرقش هم اینکه متد 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;
}

}

 

0 0
کسی نیست جواب بده. حداقل یه راهنمایی.. (9 سال پیش)
 برای این سوال 2 پاسخ وجود دارد.
پاسخ به سوال 
Reza  9 سال پیش
+1 0

سلام ، من قبلا آموزش لیست ویوی استاد رو چندین بار نگاه کردم تا آخر تونستم 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);

 

لیست ویو خیلی پیچیده ست ، نمیدونم ببین با این کارا درست میشه ، تست کن . این ساختاری که گفتم ساختار لیست ویوی استاده .

0 0
ممنونم از اینکه وقت گذاشتی. تست میکنم (9 سال پیش)
+1 0
من همون کاری که گفتین رو انجام دادم ولی باز حل نشد. آداپتر من extends BaseAdapter هست آیا این با لیست ویو استاد که extends ArrayAdapter فرق میکنه؟ و اینکه من از CheckBox استفاده نکردم. و با تغییر یه ImageView میخوام مشخص کنم که پیامم جز پیامهای برگزیده س. این مواردی که گفتم موردی پیش نمیارن؟! (9 سال پیش)
0 0
همون imageView میتونه مثل checkBox عمل کنه و یه حالت true و false داشته باشه . ولی شما کد خودتو با استاد مقایسه کنی میفهمی . الان دیدم شما از BaseAdapter استفاده میکنید ، ولی نباید فرق کنه ! با این کدها که دادم چیزی تغییر نکرد ؟ مثل کدهای خودتون کار میکنه ؟ (9 سال پیش)
0 0
نه متاسفانه تغییری نکرد. خب منظور شما از imageView میتونه مثل checkBox عمل کنه و یه حالت true و false داشته باشه چیه؟! (9 سال پیش)
+1 0
یعنی کدهای استاد یه checkBox داشت که با کلیک روی اون ، اون آیتم انتخاب میشد ، یا از انتخاب خارج میشد . شما هم یک imageView دارید که با کلیک روی اون ، اون آیتم انتخاب میشه یا از انتخاب خارج میشه و شکل ستاره عوض میشه . زیاد فرقی نداره . نمیدونم ، یا از لیست ویوی استاد استفاده کنید ، یا همین کدها رو در استک سرچ کنید ببینید پاسخ درست و مشابه که کار کرده چیه . (9 سال پیش)
+1 0
فکر کنم چون متد getView هر دفعه صدا زده میشه ، وقتی ک اسکرول می کنین به سمت پایین دیگه مقادیر قبلی رو اصلا نگه نداشته . شما اگه از دیتابیس استفاده کنین به راحتی میشه ک این ستاره زدن ها رو ذخیره کنین . منم یه برنامه داشتم ک کاربر قابلیت لایک و دیسلایک کردن رو داشت ک با این روش پیاده سازیش کردم . (9 سال پیش)
0 0
خب این چیزی میگید درسته، منم همین کارو کردم. اگر کدی که گذاشتم رو ببینید. البته در شرطی که گذاشتم مشخصه. خب میشه کدی که شما استفاده کردین رو بذارین یا کد من رو با کد خودتون مقایسه کنید ببینید کجا اشتباه کردم. ممنون میشم (9 سال پیش)
0 0
MarAnd میشه حداقل یه راهنمایی کنی که چطور این کارو انجام دادی (9 سال پیش)
پاسخ به سوال 
sami  9 سال پیش
+1 0

سلام.

لیست ویو شما قراره که داده های موجود در 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();
}
}
}
});

 

 

0 0
ممنونم حل شد (9 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .