BaseAdaper中的广播接收器

时间:2014-07-22 14:04:29

标签: java android broadcastreceiver baseadapter

我希望在获得当前位置(GPS)时将textview更新为listView。

所以当我有位置时,我会在我的活动中发送广播。在我的listViewAdapter中,我有一个设置文本的接收器。但我不知道我可以在哪里注册并取消注册我的广播。

当我的当前位置可用时,可能还有另一种方法可以将参数发送到我的listViewAdapter。

MainActivity:

private ArrayList<Establishment> listEstablishment;
private ListViewEstablishmentsAdapter adapter;


@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home_layout);

        pr = new PositionReceiver();

        //Get the list view
        ListView l = (ListView) findViewById(R.id.listviewEstablishments);

        //Create WebService to retrieve establishments datas
        EstablishmentInfosWebService ews = new EstablishmentInfosWebService("select * from establishment");
        listEstablishment = ews.getData();


        //Create a new adapter View
         adapter = new ListViewEstablishmentsAdapter(this, listEstablishment);
        l.setAdapter(adapter);



         public class PositionReceiver extends BroadcastReceiver {

            @Override
            public void onReceive(Context context, Intent intent) {
                Location l = (Location) intent.getExtras().get("LOCATION");
                int i = 0;
                for(Establishment e : listEstablishment) {
            double d = distance(e.getLatitude(), e.getLongitude(), l.getLatitude(), l.getLongitude(), 'K');
                e.setDistance(d+"");
            Log.d(TAG,"onreceive "+i);
            i++;
        }
            }
        }



 @Override
        public void onResume() {
            super.onResume();
            registerReceiver(pr, new IntentFilter("com.example.smartoo.POSITION_INTENT"));
        }

        /*
         * Called when the Activity is going into the background.
         * Parts of the UI may be visible, but the Activity is inactive.
         */
        @Override
        public void onPause() {

            unregisterReceiver(pr);
            super.onPause();
        }

ListViewAdapter:

public class ListViewEstablishmentsAdapter extends BaseAdapter {

    private static final String TAG = "com.example.smartoo.ListViewEstablishmentAdapter";

    //Un mécanisme pour gérer l'affichage graphique depuis un layout XML
    private LayoutInflater mInflater;
    //Le contexte dans lequel est présent notre adapter
    private final Context context;
    // Une liste d'établissements
    private ArrayList<Establishment> establishmentsList = null;



    private ViewHolder holder;

    //TODO add my currentLocation to constructor
    /**
     *
     * @param context
     * @param values
     *
     * Constructor
     */
    public ListViewEstablishmentsAdapter(Context context, ArrayList<Establishment> values) {
        super();
        this.context = context;
        establishmentsList = values;
        mInflater = LayoutInflater.from(context);
    }

    /**
     * @return number of establishments
     */
    @Override
    public int getCount() {
        return establishmentsList.size();
    }

    /**
     * @param position
     * @return Establishment to position "position"
     */
    @Override
    public Object getItem(int position) {
        return establishmentsList.get(position);
    }

    /**
     * @param position
     * @return The position of item
     */
    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //ViewHolder holder = null;
        // Si la vue n'est pas recyclée
        if (convertView == null) {
            // On récupère le layout
            convertView = mInflater.inflate(R.layout.item, null);

            holder = new ViewHolder();
            // On place les widgets de notre layout dans le holder
            holder.Name = (TextView) convertView.findViewById(R.id.name);
            holder.Description = (TextView) convertView.findViewById(R.id.description);
            holder.Distance = (TextView) convertView.findViewById(R.id.distance);

            // puis on insère le holder en tant que tag dans le layout
            convertView.setTag(holder);
        } 
        else {
            // Si on recycle la vue, on récupère son holder en tag
            holder = (ViewHolder) convertView.getTag();
        }

        // Dans tous les cas, on récupère le contact téléphonique concerné
        Establishment e = (Establishment) getItem(position);
        // Si cet élément existe vraiment…
        if (e != null) {
            // On place dans le holder les informations sur le contact
            holder.Name.setText(e.getName());
            holder.Description.setText(e.getDescription());
            //TODO calculate distance with my position and longitude and latitdue
            holder.Distance.setText(e.getDistance());
        }
        return convertView;

    }

    static class ViewHolder {
        public TextView Name;
        public TextView Description;
        public TextView Distance;
    }

    public void updateEstablishmentList(ArrayList<Establishment> newlist) {
        establishmentsList.clear();
        establishmentsList.addAll(newlist);
        this.notifyDataSetChanged();
    }
}

成立:

public class Establishment {

    //An identifer
    private int idEstablishment;

    //A Name
    private String name;

    //An address
    private String address;

    //An url picture
    private String urlImage;

    //A description
    private String description;

    //A phone number
    private String phoneNumber;

    //A type of establishment_fragment
    private int type;

    //A location
    private double latitude;
    private double longitude;

//A distance
    private String distance = "0m";


    public Establishment () {
        super();
        idEstablishment = 0;
        name = "";
        address = "";
        urlImage = "";
        description = "";
        phoneNumber = "";
        type = 0;
        latitude = 0;
        longitude = 0;
    }

    /**
     *
     * @param id
     * @param n
     * @param url
     * @param d
     * @param p
     * @param t
     * @param lat
     * @param lon
     *
     * Constructor
     */
    public Establishment (int id, String n, String a, String url, String d, String p, int t, double lat, double lon) {
        idEstablishment = id;
        name = n;
        address = a;
        urlImage = url;
        description = d;
        phoneNumber = p;
        type = t;
        latitude = lat;
        longitude = lon;
    }

    public int getIdEstablishment() {
        return idEstablishment;
    }

    public void setIdEstablishment(int idEstablishment) {
        this.idEstablishment = idEstablishment;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getUrlImage() {
        return urlImage;
    }

    public void setUrlImage(String urlImage) {
        this.urlImage = urlImage;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public double getLatitude() {
        return latitude;
    }

    public void setLatitude(double latitude) {
        this.latitude = latitude;
    }

    public double getLongitude() {
        return longitude;
    }

    public void setLongitude(double longitude) {
        this.longitude = longitude;
    }

   public String getDistance() {
        return distance;
    }

    public void setDistance(String distance) {
        this.distance = distance;
    }
}

清单:

<activity
            android:name=".HomeActivity"
            android:label="Home"
            android:theme="@style/Theme.AppCompat.Light" >
            <action android:name="android.location.PROVIDERS_CHANGED" />

            <receiver android:name=".PositionReceiver">
                <intent-filter>
                    <action android:name="com.example.smartoo.POSITION_INTENT">
                    </action>
                </intent-filter>
            </receiver>

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

**答案:**

public void updateEstablishmentList(ArrayList<Establishment> newlist) {
            establishmentsList = newlist;
            this.notifyDataSetChanged();
        }

1 个答案:

答案 0 :(得分:2)

你不应该将BroadcastReceiver放在Adapter中,它不属于那里。将其放入包含Activity的{​​{1}}或Fragment。要将新位置传递到ListView,您需要实现一种方法,将位置设置为ListView中的特定行:

当然,您的班级Adapter需要包含一个字段来存储Establishment以及相应的getter和setter:

Location

public void setLocationAtPosition(int position, Location location) { Establishment e = (Establishment) getItem(position); e.setLocation(location); notifyDataSetChanged(); } 的{​​{1}}中:

getView()