作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我获得当前位置(GPS)时,我想将 TextView 更新为 ListView 。
因此,当我拥有自己的位置时,我会在 Activity 中发送广播。在我的 listViewAdapter 中,我有一个设置文本的接收器。但我不知道在哪里可以注册和取消注册我的广播。
当我的当前位置可用时,可能有其他解决方案将参数发送到我的 listViewAdapter。
主要 Activity :
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();
}
ListView 适配器:
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;
}
}
list :
<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();
}
最佳答案
您不应该将 BroadcastReceiver
放入 Adapter
中,它不属于那里。将其放入包含 ListView
的 Activity
或 Fragment
中。要将新位置传递给 ListView
,您需要实现一个方法来将位置设置为 Adapter
中的特定行:
当然,您的类Establishment
需要包含一个字段来存储Location
以及适当的getter和setter:
public void setLocationAtPosition(int position, Location location) {
Establishment e = (Establishment) getItem(position);
e.setLocation(location);
notifyDataSetChanged();
}
在 Adapter
的 getView()
中:
Establishment e = (Establishment) getItem(position);
if (e != null) {
holder.Name.setText(e.getName());
holder.Description.setText(e.getDescription());
Location location = e.getLocation();
double longitude = location.getLongitude();
double latitude = location.getLatitude()
holder.Distance.setText(longitude + "/" + latitude);
}
关于java - BaseAdaper 中的广播接收器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24889575/
当我获得当前位置(GPS)时,我想将 TextView 更新为 ListView 。 因此,当我拥有自己的位置时,我会在 Activity 中发送广播。在我的 listViewAdapter 中,我有
我是一名优秀的程序员,十分优秀!