2

アイテムが取り込まれたGriViewがあり、グリッドビューのアイテムをクリックすると、バックグラウンドリソースをresフォルダーにある画像に変更します。私の問題は、スクロールして選択した項目に戻ると、バックグラウンド リソースがなくなることです。代わりに、グリッドビューの他のアイテムが背景を取得します。

私の onCreate メソッドには、GridView を設定する次のコードがあります。

編集私が得た提案に基づいて、カスタムアダプターを作成し、グリッドビューにデータを入力しました。私が今抱えている問題は、私の gridView 要素が現在取り込まれていることです。アダプターをセットアップするときに、ブール配列とデータ配列を渡します。データ配列には、GridView を設定するために使用する必要があるすべてのデータが含まれており、ブール配列は、グリッド項目が選択されているかどうかを確認するためのものです。

編集: 選択された GridView 要素はスクロール後も強調表示されるようになりましたが、選択されていない他の要素が強調表示されているように見えます。

アダプタークラスは次のとおりです。

public class HoursAdapter extends BaseAdapter {

    private Context mContext;
    private boolean isSelected[];
    private String hours[];
    public HoursAdapter(Context c, boolean selected[], String hours[]){
        this.isSelected = selected;
        this.mContext = c;
        this.hours = hours;
    }
    
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return hours.length;
    }

    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int arg0, View convertView, ViewGroup arg2) {
        // TODO Auto-generated method stub
        ViewHolder holder = null;
         if(convertView==null){
            LayoutInflater vi = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = vi.inflate(R.layout.hourview_item, null);
            holder = new ViewHolder();
            holder.hours =(TextView) convertView.findViewById(R.id.hours_text);
            convertView.setTag(holder);
         }else{
            holder = (ViewHolder)convertView.getTag(); 
         }
         if(isSelected[arg0-1])
          holder.hours.setBackgroundResource(R.drawable.item_background_focused);
         
         holder.hours.setText(hours[arg0-1]);
        return convertView;
    }
    
    static class ViewHolder{
        TextView hours;
    }
    

}

そして、これはアダプターをセットアップするための私のコードです:

    HoursAdapter adapter = new HoursAdapter(this,isSelected,data);
    
     
    hoursView.setAdapter(adapter);

hoursView.setOnItemClickListener(new OnItemClickListener() {


    @Override
    public void onItemClick(AdapterView<?> parent, View v, int position,
            long id) {
        // TODO Auto-generated method stub
        v.setBackgroundResource(R.drawable.item_background_focused);
    }
});

どんな助けでも大歓迎です!

4

1 に答える 1

0

ビューのリサイクルがアダプター内でどのように機能するかを考慮していないようです。アダプター ビューを使用すると、スクロール中にリサイクルされます。これは、クリックしたばかりのアイテムをレンダリングするために使用される同じビューであり、スクロール操作後に別のアイテムをレンダリングするために再利用する必要があります。

独自のアダプタ クラスを定義し、選択/非選択ステータスを自分で管理し (例: データと同じサイズのブール値の配列を使用)、 を介して背景を適切に設定/リセットする必要がありますBaseAdapter.getView(int, View, ViewGroup)これは非常に基本的なトピックであり、公式の Android 開発者ポータルで多くのチュートリアルとリファレンスを入手できます。

于 2013-04-20T20:26:36.470 に答える