2017-03-18 13 views
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; 
     } 
    } 

答えて

0

ある未充填するために満たされたのonClick時に、あなたのArrayListで、あなたのデータセットのFAVアイコンIDを更新しています。

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

を変更しました。 – Shubham

+0

あなたのコードによれば、イメージのアイコンをビューホルダーに設定しようとしていますが、これはバインディングが発生したときには機能しません。あなたのデータセットは更新されておらず、古い値を持っているからです。ところで、notifyDataSetInvalidatedは、あなたが思うように効率の悪いものではありません。可視領域内のビューを更新するだけです。 – albeee

0

あなたはそれが再描画されると、それは「選択」設定で再描画されるように、リストビュー項目がリストビュー項目自体で選択されていることの情報を格納する必要があります。これを行うには、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

が動作していますが、外部の画面のアイコンのアイコンもお気に入りにする必要はありません。私の画面では、レコードが1番目のレコード(2番目の場合)をクリックして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

thnxは最後に動作します@キサン – 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; 
     } 
    } 
関連する問題