2017-03-18 14 views
0

我有一個列表視圖,其中有一個名稱和imageview爲最喜歡的按鈕圖標,當我點擊最喜歡的圖標圖標更改爲填充從未填充但當我滾動列表視圖圖標更改從填充未填充的,這是我的代碼listview最喜歡的圖標得到改變,而滾動列表視圖

public class AdapterFind extends BaseAdapter { 

     ArrayList<BeanFindName> arrayListAd; /* arraylist with model class */ 
     Activity activity; 
     DBFavourite dbfav;     /* database class */ 

     private boolean[] favorites;   `ADDED` 


     public AdapterFind(ArrayList<BeanFindName> arrayListAd, Activity   activity) { 
      this.arrayListAd = arrayListAd; 
      this.activity = activity; 
      dbfav = new DBFavourite(activity); 

      favorites = new boolean[this.arrayListAd.size()]; `ADDED` 

     } 

     @Override 
     public int getCount() { 
      return arrayListAd.size(); 
     } 

     @Override 
     public Object getItem(int position) { 
      return arrayListAd.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return 0; 
     } 

     private class ViewHolder { 

      TextView txtID; 
      TextView txtName; 
      ImageView imvFavourite; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 

      final ViewHolder holder; 
      LayoutInflater inflater = activity.getLayoutInflater(); 

      if (convertView == null) { 
       convertView = inflater.inflate(R.layout.activity_customized_listview, null); /* layout file for listview row items */ 
       holder = new ViewHolder(); 

       holder.txtID = (TextView) convertView 
         .findViewById(R.id.customized_listview_tv_textId); /* textview id */ 
       holder.txtName = (TextView) convertView 
         .findViewById(R.id.customized_listview_lv_names); /* texview for names */ 
       holder.imvFavourite = (ImageView) convertView 
         .findViewById(R.id.customized_listview_imv_favourite); /* imageview for favorite icons */ 

       convertView.setTag(holder); 
      } else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 

      holder.txtID.setText(String.valueOf(arrayListAd.get(position).getNameId())); /* model class functions */ 
      holder.txtName.setText(arrayListAd.get(position).getName()); /* model class functions */ 

      if (arrayListAd.get(position).getFinfavId() > 0 || favorites[position]) { 
       holder.imvFavourite.setImageResource(R.mipmap.customized_listview_iv_favourites_boy_filled); 

      } else if (arrayListAd.get(position).getFinfavId() == 0 || !favorites[position]) { 
       holder.imvFavourite.setImageResource(R.mipmap.customized_listview_iv_favourites_boy_not_filled); 
      } 

      holder.imvFavourite.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

`ADDED` 

     if (favorites[position] || arrayListAd.get(position).getFinfavId() > 0) { /* check for scrolling and database also to change favorite icon */ 
         holder.imvFavourite.setImageResource(R.mipmap.customized_listview_iv_favourites_boy_not_filled); 
         dbfav.deleteByID(holder.txtID.getText().toString()); /* delete records from database*/ 
         favorites[position] = false; 
        } else if (arrayListAd.get(position).getFinfavId() == 0 || !favorites[position]) {       holder.imvFavourite.setImageResource(R.mipmap.customized_listview_iv_favourites_boy_filled); 
     dbfav.insertDataInFavourite(holder.txtID.getText().toString()); /*inserts records to database */ 
         favorites[position] = true; 
        } 
       }    
      }); 
      return convertView; 
     } 
    } 

回答

0

你需要做的就是更新您的數據集是在您的onClick ArrayList中的最愛圖標標識。

arrayListAd.get(position).setFinfavId(dark or light) 
notifyDataSetInvalidated(); 
+0

這將工作,但將是非常低效的。 – Shubham

+0

根據您的代碼,您嘗試將圖像圖標設置爲視圖持有者,這在綁定發生時不起作用。因爲你的數據集沒有更新並且仍然有舊值。順便提一下,notifyDataSetInvalidated不會導致您認爲的效率低下。它只是在可見區域刷新您的視野。 – albeee

0

你需要存儲的信息列表視圖項在ListView項目本身的選擇,這樣,當它被重新繪製,它重繪與「選擇」設置。爲此,我們添加一個字段到ViewHolder類來存儲相同的內容。我在此處添加了代碼:

public class AdapterFind extends BaseAdapter { 

ArrayList<BeanFindName> arrayListAd; /* arraylist with model class */ 
Activity activity; 
DBFavourite dbfav;     /* database class */ 

public AdapterFind(ArrayList<BeanFindName> arrayListAd, Activity   activity) { 
    this.arrayListAd = arrayListAd; 
    this.activity = activity; 
    dbfav = new DBFavourite(activity); 

} 

@Override 
public int getCount() { 
    return arrayListAd.size(); 
} 

@Override 
public Object getItem(int position) { 
    return arrayListAd.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return 0; 
} 

private class ViewHolder { 

    TextView txtID; 
    TextView txtName; 
    ImageView imvFavourite; 
    boolean isSelected; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    final ViewHolder holder; 
    LayoutInflater inflater = activity.getLayoutInflater(); 

    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.activity_customized_listview, null); /* layout file for listview row items */ 
     holder = new ViewHolder(); 

     holder.txtID = (TextView) convertView 
       .findViewById(R.id.customized_listview_tv_textId); /* textview id */ 
     holder.txtName = (TextView) convertView 
       .findViewById(R.id.customized_listview_lv_names); /* texview for names */ 
     holder.imvFavourite = (ImageView) convertView 
       .findViewById(R.id.customized_listview_imv_favourite); /* imageview for favorite icons */ 
     holder.isSelected = false; 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.txtID.setText(String.valueOf(arrayListAd.get(position).getNameId())); /* model class functions */ 
    holder.txtName.setText(arrayListAd.get(position).getName()); /* model class functions */ 

    if (arrayListAd.get(position).getFinfavId() > 0) { 
     holder.imvFavourite.setImageResource(R.mipmap.fav_filled); 
     holder.imvFavourite.setTag("Dark=" + holder.txtID.getText()); 

    } else if (arrayListAd.get(position).getFinfavId() == 0) { 
     holder.imvFavourite.setImageResource(R.mipmap.fav_not_filled); 
     holder.imvFavourite.setTag("Light=" + holder.txtID.getText()); 

    } 
    if (holder.isSelected){ 
     // set the imvFavourite 
    }else{ 
     // un set the imvFavourite. This is important! 
    } 

    holder.imvFavourite.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String tagName = holder.imvFavourite.getTag().toString(); 
      String str[] = tagName.split("="); 

      // Setting the isSelected field here 
      holder.isSelected = true 
      tagName = str[0]; 
      String strID = str[1]; 

      if (tagName.equalsIgnoreCase("Light")) { 
       holder.imvFavourite.setImageResource(R.mipmap.fav_filled); 
       holder.imvFavourite.setTag("Dark=" + strID); 
       dbfav.insertDataInFavourite(strID); /* function inserts records in database */ 

      } else if (tagName.equalsIgnoreCase("Dark")) { 
       holder.imvFavourite.setImageResource(R.mipmap.fav_not_filled); 
       holder.imvFavourite.setTag("Light=" + strID); 
       dbfav.deleteByID(strID);   /* function that delete record from database */ 

      } 
     } 
    }); 
    return convertView; 
} 
} 
+0

工作,但不是因爲它應該也喜歡外面的屏幕的fav圖標例如。在我的屏幕10條記錄可見,當我點擊第一條記錄(如果第二)和滾動比第11條記錄(比第12條)也收藏並繼續 – Dhaval

+0

@Dhaval:是否有可能'arrayListAd.get(position).getFinfavId()'是小於零? – Shubham

+0

添加了一些代碼,但仍然不能正常工作滾動問題解決了,但當按下並回到圖標更改@Shubham – Dhaval

0

將下面給出的適配器類替換爲您的適配器類。 第一件事ViewHolder類不是靜態的第二件事情永遠不會讓最終變量或類使用getView()方法。請參考此代碼。有關更多信息,請參閱此鏈接。
androidsimplifycodes.blogspot.in

package com.androidsimplifycodes.example.ListView; 

import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 

import com.androidsimplifycodes.example.R; 

import java.util.ArrayList; 

public class ListViewAdapter extends BaseAdapter { 

    private Context context; 
    private ArrayList list; 

    // passing the objects array list 
    public ListViewAdapter(Context context, ArrayList list) { 
     this.context = context; 
     this.list = list; 
    } 

    @Override 
    public int getCount() { 
     return list.size(); 
    } 

    @Override 
    public Object getItem(int i) { 
     return list.get(i); 
    } 

    @Override 
    public long getItemId(int i) { 
     return i; 
    } 

    @Override 
    public View getView(int i, View convertView, ViewGroup viewGroup) { 

     ViewHolder holder; 
     // this condition only first time true because when adapter call that 
     // time your View is null so fist we bind xml file then after using ViewHolder 
     // bind views. 
     if (convertView == null) { 
      // bind your list_item.xml here 
      convertView = LayoutInflater.from(context).inflate(R.layout.list_item, viewGroup, false); 
      holder = new ViewHolder(convertView); 
      // if you not set holder into View then each and every time fist bind xml 
      // then after make ViewHolder calls 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.tvText.setText(list.get(i).getText()); 

     return convertView; 
    } 

    // this class use for the memory utilization for example one time your 
    // xml view bind with java using findViewById then stored into ViewHolder 
    // using setTag method. Here question arise but why required this procedure 
    // because at run time each and every time not bind your xml view with adapter 
    // it will be provide memory utilization and scrolling speed to the View. 
    private static class ViewHolder { 
     TextView tvText; 

     ViewHolder(View rootView) { 
      initView(rootView); 
     } 

     private void initView(View rootView) { 
      tvText = (TextView) rootView.findViewById(R.id.tvText); 
     } 
    } 
} 
+0

最終它的工作@Kishan – Dhaval

0

解決的問題,同時滾動列表視圖喜歡的圖標改變

public class AdapterFind extends BaseAdapter { 

     ArrayList<BeanFindName> arrayListAd; /* arraylist with model class */ 
     Activity activity; 
     DBFavourite dbfav;     /* database class */ 

     private boolean[] favorites;   `ADDED` 


     public AdapterFind(ArrayList<BeanFindName> arrayListAd, Activity   activity) { 
      this.arrayListAd = arrayListAd; 
      this.activity = activity; 
      dbfav = new DBFavourite(activity); 

      favorites = new boolean[this.arrayListAd.size()]; `ADDED` 

     } 

     @Override 
     public int getCount() { 
      return arrayListAd.size(); 
     } 

     @Override 
     public Object getItem(int position) { 
      return arrayListAd.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return 0; 
     } 

     private class ViewHolder { 

      TextView txtID; 
      TextView txtName; 
      ImageView imvFavourite; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 

      final ViewHolder holder; 
      LayoutInflater inflater = activity.getLayoutInflater(); 

      if (convertView == null) { 
       convertView = inflater.inflate(R.layout.activity_customized_listview, null); /* layout file for listview row items */ 
       holder = new ViewHolder(); 

       holder.txtID = (TextView) convertView 
         .findViewById(R.id.customized_listview_tv_textId); /* textview id */ 
       holder.txtName = (TextView) convertView 
         .findViewById(R.id.customized_listview_lv_names); /* texview for names */ 
       holder.imvFavourite = (ImageView) convertView 
         .findViewById(R.id.customized_listview_imv_favourite); /* imageview for favorite icons */ 

       convertView.setTag(holder); 
      } else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 

      holder.txtID.setText(String.valueOf(arrayListAd.get(position).getNameId())); /* model class functions */ 
      holder.txtName.setText(arrayListAd.get(position).getName()); /* model class functions */ 

      if (arrayListAd.get(position).getFinfavId() > 0 || favorites[position]) { 
       holder.imvFavourite.setImageResource(R.mipmap.customized_listview_iv_favourites_boy_filled); 

      } else if (arrayListAd.get(position).getFinfavId() == 0 || !favorites[position]) { 
       holder.imvFavourite.setImageResource(R.mipmap.customized_listview_iv_favourites_boy_not_filled); 
      } 

      holder.imvFavourite.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

`ADDED` 

     if (favorites[position] || arrayListAd.get(position).getFinfavId() > 0) { /* check for scrolling and database also to change favorite icon */ 
         holder.imvFavourite.setImageResource(R.mipmap.customized_listview_iv_favourites_boy_not_filled); 
         dbfav.deleteByID(holder.txtID.getText().toString()); /* delete records from database*/ 
         favorites[position] = false; 
        } else if (arrayListAd.get(position).getFinfavId() == 0 || !favorites[position]) {       holder.imvFavourite.setImageResource(R.mipmap.customized_listview_iv_favourites_boy_filled); 
     dbfav.insertDataInFavourite(holder.txtID.getText().toString()); /*inserts records to database */ 
         favorites[position] = true; 
        } 
       }    
      }); 
      return convertView; 
     } 
    }