2

私は持っていListViewます。ImageViewListView の行に があります。ImageView に onClick 属性をアタッチしました。私の onClick 関数は

public void alarmClick(View v)
{
    ImageView bell = (ImageView)v.findViewById(R.id.mEventImage);
    bell.setImageResource(R.drawable.bell_on);
    if(bell.getTag() == null)
    {
        bell.setImageResource(R.drawable.bell_on);
        bell.setTag(R.drawable.bell_on);
    }
    else if((Integer)bell.getTag() == R.drawable.bell_on)
    {
        bell.setImageResource(R.drawable.bell_off);
        bell.setTag(R.drawable.bell_off);
    }
    else
    {
        bell.setImageResource(R.drawable.bell_on);
        bell.setTag(R.drawable.bell_on);
    }
}

ImageViewソースを切り替えようとしていますが、その時点で画面に表示されていないImageView他の多くの行をクリックすると切り替えられます。ImageViewこれは、ビューが で再利用されるためである可能性がありますListView。一意の行ごとに行う方法の提案。

アダプタ クラス

package com.example.drawer;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;


public class EventAdapter extends ArrayAdapter<EventList> {

    Context context;
    ArrayList<EventList> data;
    int layoutResourceId;

    public EventAdapter(Context context, int textViewResourceId, ArrayList<EventList> data) {
        super(context, textViewResourceId, data);
        this.context = context;
        this.data = data;
        this.layoutResourceId = textViewResourceId;
        // TODO Auto-generated constructor stub
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        View row = convertView;
        EventHolder holder =  null;
        if(row == null)
        {
            LayoutInflater inflator = ((Activity)context).getLayoutInflater();
            row = inflator.inflate(layoutResourceId, parent, false);
            holder = new EventHolder();
            holder.coord = (TextView)row.findViewById(R.id.eventCoor);
            holder.icon = (ImageView)row.findViewById(R.id.icon);
            holder.eventName = (TextView)row.findViewById(R.id.eventNam);
            holder.location = (TextView)row.findViewById(R.id.eventLoc);
            holder.time = (TextView)row.findViewById(R.id.eventTime);
            row.setTag(holder);

        }
        else
        {
            holder = (EventHolder)row.getTag();
        }
        EventList listItem = data.get(position);
        ImageHelper imageHelper = new ImageHelper();
        Bitmap icon = BitmapFactory.decodeResource(context.getResources(), R.drawable.ipl);
        Bitmap newIcon = imageHelper.getRoundedCornerBitmap(icon, 200);
        holder.coord.setText(listItem.coord);
        holder.eventName.setText(listItem.eventName);
        holder.location.setText(listItem.location);
        holder.time.setText(listItem.time);
        holder.icon.setImageBitmap(newIcon);
        holder.id = listItem.id;
        holder.day = listItem.day;
        //Log.d("ListView", "Executed");
        return row;

    }


    static class EventHolder
    {
        ImageView icon;
        TextView eventName;
        TextView location;
        TextView time;
        TextView coord;
        int id;
        int day;
    }
}
4

2 に答える 2

0

はい、その理由は、ビューがリサイクルされ、同じ ImageView が別の行に来ているためです。

あなたのリスト項目 - EventList は、ベルがオンまたはオフである必要があり、getView で適切に設定する必要があります。これは、ユーザーが最初のアイテムを録画してベルをオンに設定した場合、他のアイテムがそのビューを再利用しているときにベルをオフに戻すことを意味します。

于 2013-08-15T07:05:53.427 に答える
0

Cursor Loaders を使用し、Activity/Fragment に LoaderCallbacks を実装させることをお勧めします。カーソルの使用はかなり簡単です。Sqlite データベースなどを使用して EventData を管理し、ContentProvider を使用してデータを取得します

また、EventAdapter で CursorAdapter を拡張し、次のメソッドをオーバーライドします。

public class EventAdapter extends CursorAdapter {

    int layoutResourceId;

    public EventAdapter(Context context, int textViewResourceId) 
    {
        super(context, textViewResourceId, data);
        this.layoutResourceId = textViewResourceId;
    }

    static class EventHolder
    {
       final ImageView icon;
       final ImageView bell;
       final TextView eventName;
       final TextView location;
       final TextView time;
       final TextView coord;
       final int id;
       final int day;

       EventHolder(View view)
        {
           coord = (TextView)view.findViewById(R.id.eventCoor);
           icon = (ImageView)view.findViewById(R.id.icon);
           bell = (ImageView) view.findViewById(R.id.mEventImage);
           eventName = (TextView)view.findViewById(R.id.eventNam);
           location = (TextView)view.findViewById(R.id.eventLoc);
           time = (TextView)view.findViewById(R.id.eventTime);
           id = -1;
           day = -1;
        }
    }
    //Re use the visible views
    @Override
    public void bindView(View view, Context context, Cursor cursor)
    {
        ViewHolder holder = (ViewHolder) view.getTag();
        EventList listItem = cursor.get(position);
        ImageHelper imageHelper = new ImageHelper();
        Bitmap icon = BitmapFactory.decodeResource(context.getResources(), R.drawable.ipl);
        Bitmap newIcon = imageHelper.getRoundedCornerBitmap(icon, 200);
        holder.coord.setText(listItem.coord);
        holder.eventName.setText(listItem.eventName);
        holder.location.setText(listItem.location);
        holder.time.setText(listItem.time);
        holder.icon.setImageBitmap(newIcon);
        holder.id = listItem.id;
        holder.day = listItem.day;

        //Checking Bell State Columnview if it is OFF or ON
        if(cursor.getString(YourActivity.COL_EVENTBELL_IMAGEVIEW_STATE).equals("on"))
        {
            holder.bell.setImageResource(R.drawable.bell_on);
        }
        else
        {
            holder.bell.setImageResource(R.drawable.bell_off);
        }

    }
    //Create new views, all to be visible at once
    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent)
    { 
        View view = LayoutInflater.from(context).inflate(layoutResourceId, parent, false);
        EventHolder holder = new EventHolder(view);

        view.setTag(holder);

        return view;
    }
}

アクティビティ/フラグメントでは、リスナーを使用してベルの状態を更新できます。AlarmClick() は次のようになります。

public void alarmClick()
    {
    Cursor cursor = mEventAdapter.getCursor();
    ContentValues eventValues = new ContentValues();
    String event_bell_state = cursor.getString(YourActivity.COL_EVENT_BELL_IMAGEVIEW_STATE);
    String event_bell_id = cursor.getString(YourActivity.COL_EVENTBELL_ID);

    if(event_bell_state == "on")
    {
        eventValues.put(YourActivity.COL_EVENTBELL_IMAGEVIEW_STATE, "off");
    }
    else
    {
        eventValues.put(YourActivity.COL_EVENTBELL_IMAGEVIEW_STATE, "on");
    }

    String whereClause = YourActivity.COL_EVENTBELL_ID + " = ?";
    String[] selectionArgs = new String[]{String.valueOf(event_bell_id)};

    getActivity().getApplicationContext().getContentResolver().update(EventEntry.CONTENT_URI, eventValues, whereClause, selectionArgs);
    mEventAdapter.notifyDataSetChanged();
    getLoaderManager().restartLoader(EVENTLIST_LOADER, null, this);
    }
于 2015-06-08T09:04:21.127 に答える