0

カスタムリストビューのイメージビューをクリックしようとしていて、onClick イベントでイメージを変更したいと考えています。成功をクリックして他の操作を実行できますが、イメージはイメージビューに反映されません。

参照用のコードは次のとおりです。

public class ReminderAdapter extends BaseAdapter {

private Activity activity;   
private static LayoutInflater inflater=null;
ImageView firstStar,secondStar,thirdStar,fourthStar,fifthStar;   

public ReminderAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
    activity = a;
    data=d;
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    faceBold = Typeface.createFromAsset(activity.getAssets(),
            "fonts/eau_sans_bold.otf");
    faceNormal = Typeface.createFromAsset(activity.getAssets(),
            "fonts/eau_sans_book.otf");         

}

public int getCount() {
    return data.size();
}
public Object getItem(int position) {
    return position;
}
public long getItemId(int position) {
    return position;
}    
public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;        


   if(activity instanceof SearchDishoom)
   {
       if(convertView==null)
           vi = inflater.inflate(R.layout.remind_dish_list_row, null);        

       firstStar = (ImageView)vi.findViewById(R.id.hotelListFirstStar);
       secondStar = (ImageView)vi.findViewById(R.id.hotelListSecondStar);
       thirdStar = (ImageView)vi.findViewById(R.id.hotelListThirdStar);
       fourthStar = (ImageView)vi.findViewById(R.id.hotelListFourthStar);
       fifthStar = (ImageView)vi.findViewById(R.id.hotelListFifthStar);
       firstStar.setFocusable(false);
       secondStar.setFocusable(false);
       thirdStar.setFocusable(false);
       fourthStar.setFocusable(false);
       fifthStar.setFocusable(false);           

       firstStar.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            setStar(1);

        }
    });
       secondStar.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            //ReminderList.clear();
            setStar(2);                 
        }
    });
       thirdStar.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            setStar(3);                 
        }
    });
       fourthStar.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            setStar(4);                 
        }
    });
       fifthStar.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {                
            setStar(5);                 
        }
    });           
   }       
    return vi;
}


  public void setStar(int btnNumber) {
    if (btnNumber == 1) {       

        firstStar.setImageResource(R.drawable.rated);
        secondStar.setImageResource(R.drawable.unrated);
        thirdStar.setImageResource(R.drawable.unrated);
        fourthStar.setImageResource(R.drawable.unrated);
        fifthStar.setImageResource(R.drawable.unrated);
        //postRating(1);
    }
    if (btnNumber == 2) {           

        firstStar.setImageResource(R.drawable.rated);
        secondStar.setImageResource(R.drawable.rated);
        thirdStar.setImageResource(R.drawable.unrated);
        fourthStar.setImageResource(R.drawable.unrated);
        fifthStar.setImageResource(R.drawable.unrated);
        //postRating(2);
    }
    if (btnNumber == 3) {           

        firstStar.setImageResource(R.drawable.rated);
        secondStar.setImageResource(R.drawable.rated);
        thirdStar.setImageResource(R.drawable.rated);
        fourthStar.setImageResource(R.drawable.unrated);
        fifthStar.setImageResource(R.drawable.unrated);
        //postRating(3);
    }
    if (btnNumber == 4) {

        firstStar.setImageResource(R.drawable.rated);
        secondStar.setImageResource(R.drawable.rated);
        thirdStar.setImageResource(R.drawable.rated);
        fourthStar.setImageResource(R.drawable.rated);
        fifthStar.setImageResource(R.drawable.unrated);
        //postRating(4);
    }
    if (btnNumber == 5) {

        firstStar.setImageResource(R.drawable.rated);
        secondStar.setImageResource(R.drawable.rated);
        thirdStar.setImageResource(R.drawable.rated);
        fourthStar.setImageResource(R.drawable.rated);
        fifthStar.setImageResource(R.drawable.rated);
        //postRating(5);
    }
}   

何が起こっているのかわかりません。参考やヒントを教えてください。
前もって感謝します。

4

3 に答える 3

0

あなたのコードは少しバグがあるように見えます。

デフォルトでは、アダプターは子ビューを再利用するため、アダプターを扱う重要なポイントの 1 つは、正しいターゲットの値を更新することです。

あなたのコードでは、ユーザーが をクリックするfirstStartと、setStarメソッドが呼び出されます。

firstStar.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View arg0) {
        setStar(1);

    }
}

では、インスタンスsetStarを参照していますが、インスタンスが期待されるインスタンスに接続されてfireStartいるという保証はありません。fireStarたとえば、ListView に複数の項目がある場合、メソッドが呼び出されるfireStartたびにインスタンスが上書きされます。getView

public void setStar(int btnNumber) {
    if (btnNumber == 1) {

        firstStar.setImageResource(R.drawable.rated);
        ...
        //postRating(1);
    }
    ...
}

したがって、必要なのは正しいターゲットへの参照を維持することです。これをアーカイブする簡単な方法の 1 つは、アダプターで ViewHolder パターンを使用することです。このようなもの...

class ViewHolder {
    View firstStar;
    View secondStar;
    ...
}

ViewHolder holder = new ViewHolder();
holder.firstStar = firstStar;
holder.secondStar = secondStar;

fireStar.setTag(holder);
firstStar.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View arg0) {
        ViewHolder holder = arg0.getTag();
        //update images inside holder,
        //instead of refer 'adapter instance scope field members'.
        holder.firstStar.setImageResource(R.drawable.rated);
    }
}

Android の ViewHolder パターンに関する良い記事があります。チェック - http://developer.android.com/training/improving-layouts/smooth-scrolling.html#ViewHolder

于 2013-08-26T08:48:25.697 に答える
0

これを試して

 firstStar.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            setStar(1);
            listAdapter.notifyDataSetChanged();
        }
    });
于 2013-08-26T08:04:25.133 に答える
0

notifyDataSetChanged()---- 接続されたオブザーバーに、基になるデータが変更されたこと、およびデータ セットを反映するビューがそれ自体を更新する必要があることを通知します。

これは、ユーザーに新しいデータ セットを表示するために、そのデータを表示する/データに基づく/使用するビューを無効にする (再測定、再描画する) 必要があることを意味します。

NotifyDataSetChanged

firstStar.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            setStar(1);
            your_adapter.notifyDataSetChanged();
        }
于 2013-08-26T10:38:06.003 に答える