2016-04-12 6 views
6

先週、この問題を解決しようとしました。すべての同様の質問を参照してください、私はなぜソリューションが私のために動作しないのか分からない。 私はリストビューを持ち、各アイテムはイメージビューを持っています。イメージビューでクリックすると、イメージリソースを変更したい。よくすべて完了。スクロールするとイメージ・リソースが変化します。 私の完全なコードは次のとおりです。私はミスをしていリストビューのスクロール時に画像が変化する

public class CustomBaseAdapter extends BaseAdapter { 

Context context; 
ArrayList<String> items; 

    public CustomBaseAdapter(Context context,ArrayList<String> items){ 
     this.context = context; 
     this.items = items; 
    } 

private class ViewHolder{ 
    TextView titr; 
    ImageView image; 
} 

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

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

@Override 
public long getItemId(int position) { 
    return items.hashCode(); 
} 

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    View vi = view; 
    final ViewHolder holder ; 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    if(view==null){ 

     vi = inflater.inflate(R.layout.customlistitem,null); 
     holder = new ViewHolder(); 
     holder.titr = (TextView) vi.findViewById(R.id.listtext); 
     holder.image = (ImageView) vi.findViewById(R.id.listimg); 
     holder.image.setTag(position); 
     vi.setTag(holder); 
    } 
    else{ 
     holder = (ViewHolder) vi.getTag(); 
    } 


    holder.titr.setText(items.get(position)); 

    holder.image.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      v.setBackgroundResource(R.drawable.fav_ic); 
     } 
    }); 
    return vi; 
} 

}

答えて

1

public class CustomBaseAdapter extends BaseAdapter { 

Context context; 
ArrayList<Items> items; 

    public CustomBaseAdapter(Context context,ArrayList<Items> items){ 
     this.context = context; 
     this.items = items; 
    } 

    private class ViewHolder{ 
    TextView titr; 
    ImageView image; 
    } 

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

@Override 
public Items getItem(int position) { 
    return items.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return items.hashCode(); 
} 

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    View vi = view; 
    final ViewHolder holder ; 

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    if(view==null){ 

     vi = inflater.inflate(R.layout.customlistitem,null); 
     holder = new ViewHolder(); 
     holder.titr = (TextView) vi.findViewById(R.id.listtext); 
     holder.image = (ImageView) vi.findViewById(R.id.listimg); 
     holder.image.setTag(position); 
     vi.setTag(holder); 
    } 
    else{ 
     holder = (ViewHolder) vi.getTag(); 
    } 


    holder.titr.setText(items.get(position).getStrTxt()); 
    holder.image.setImageResource(items.get(position).getDrawableImage()); 
    holder.image.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      items.set(position,new Items(R.drawable.fav_ic)); 
      notifyDataSetChanged(); 
     } 
    }); 
    return vi; 
} 
} 

はモデルクラスの追加、これを試してください:アンドロイドは、常にそれに行を破棄し、再作成するため

public class Items { 


    int drawableImage; 
    String strTxt; 


    public Items(int drawableImage) { 
    this.drawableImage = drawableImage; 
    } 
    public int getDrawableImage() { 
     return drawableImage; 
    } 

    public void setDrawableImage(int drawableImage) { 
     this.drawableImage = drawableImage; 
    } 

    public String getStrTxt() { 
     return strTxt; 
    } 

    public void setStrTxt(String strTxt) { 
     this.strTxt = strTxt; 
    } 
} 
+0

このコードはすばらしく見えます。しかし、行: 'items.set(position).setDrawableImage(R.drawable.fav_ic);' items.get()に変更する必要があります –

+0

私はコードを編集しました –

+0

ありがとうございます。あなたのコードは正しい。私の問題は解決されました。 –

1

これは、リストビューをスクロールするときにアンドロイドシステムが常に新しい行を作成し、非表示の行を破棄するためです。その後、下にすべてがうまくなりますようあなたは)(getViewメソッドを変更する必要があります

@Override 
public View getView(int position, View view, ViewGroup parent) { 
    View vi = view; 
    final ViewHolder holder ; 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 

    if(view==null){ 

     vi = inflater.inflate(R.layout.customlistitem,null); 
     holder = new ViewHolder(); 
     holder.titr = (TextView) vi.findViewById(R.id.listtext); 
     holder.image = (ImageView) vi.findViewById(R.id.listimg); 
     holder.image.setTag(position); 
     vi.setTag(holder); 
    } 
    else{ 
     holder = (ViewHolder) vi.getTag(); 
    } 


    holder.titr.setText(items.get(position)); 
if(sp.getBoolean("position="+position, false)){ 
    v.setBackgroundResource(R.drawable.fav_ic); 
} 
    holder.image.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      v.setBackgroundResource(R.drawable.fav_ic); 

SharedPreferences.Editor edit = sp.edit(); 
edit.putBoolean("position="+position, true); 
edit.commit(); 

     } 
    }); 
    return vi; 
} 
6

あなたの背景画像が特定の行に設定されているかどうかをチェックするためにホルダーに1つのブール値を使用する必要があります。

ホルダー

private class ViewHolder{ 
    TextView titr; 
    ImageView image; 
boolean isSet; 
} 

設定された画像

holder.image.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      v.setBackgroundResource(R.drawable.fav_ic); 
holder.isSet = true 
     } 
    }); 

if(holder.isSet) 
{ 
holder.image.setBackgroundResource(R.drawable.fav_ic); 
} 
else{ 
holder.image.setBackgroundResource(no image or other image); 
} 

は、これが役立つことを願っています。

1

getView()は各行を呼び出し、getView()でlayoutInflaterを定義すると、各行に対してLayoutInflaterを何度も繰り返し定義するため、コンストラクタでlayoutInflaterを定義する必要があります。

1

はい、この問題はListViewに常に表示されます。

は、次の2つの選択肢があります。

まず、ListViewに行ごとに状態を保存し、行を表示する前にこの状態を確認するためにあなたのアダプタを変更します。

第2の私はこの1つを推奨し、コード内で使用します。RecyclerViewを使用できます。この問題は発生しません。

関連する問題