2014-09-21 2 views
0

데이터가 변경 될 때마다 Listview에 새 데이터를 표시하기 위해 NotifyDataSetchanged()를 사용했습니다. 그러나 다음 코드를 입력하면 목록보기에 아무 것도 없습니다. 무엇이 문제입니까? 그리고 그것을 알아 내려면 어떻게해야합니까? 알려 주시기 바랍니다.데이터가 변경 될 때마다 Listview에 새 데이터를 표시하는 방법 Notifierydasetchanged()

큰 감사를드립니다! 이름, 위도와 경도 :

난 당신의 코드에서 보는 것과
 String names[] = { 
      "Tom", 
      "Jane", 
      "Mary", 
      }; 

    Double lati[] = { 
      35.000001, 
      26.000001, 
      67.000001, 
      }; 

    Double longi[] = { 
      129.000001, 
      159.000001, 
      100.000001, 
      };   


    originalValues = new ArrayList<HashMap<String, Object>>(); 

    HashMap<String, Object> temp; 

    if (x==0){ 
     originalValues.clear(); 
      } 
    else{ 
     int oriname = names.length; 
     for (int i = 0; i < oriname; i++) { 
      temp = new HashMap<String, Object>(); 

      temp.put("name", names[i]); 
      temp.put("lati", lati[i]); 
      temp.put("longi", longi[i]); 

      temp.put("dis",  Math.round(Math.round(6371000.0 * Math.acos(Math.sin(Math.PI/180 * lati[i]) * Math.sin(Math.PI/180 * Double.valueOf(x)) 
    + Math.cos(Math.PI/180 * lati[i]) * Math.cos(Math.PI/180 * Double.valueOf(x)) * Math.cos(Math.PI/180 * (longi[i] - Double.valueOf(y)))))/1000)); 


      originalValues.add(temp); 

     } 
     adapter.notifyDataSetChanged(); 
    } 

    adapter = new CustomAdapter(this,R.layout.tab01_consul_row, originalValues); 
    insurListView.setAdapter(adapter); 

답변

0

, 나는 대신에 (일반적으로 너무 복잡 아이디어 자체) HashMaps을의 ArrayList를하는 세 개의 값을 저장할하는 클래스를 만들을 생각 . 그런 다음이 목록의 어댑터 목록보기를 만듭니다. 예를 들어 , 당신의 목록보기 항목 클래스 :

public class ItemAdapter extends BaseAdapter { 

    private LayoutInflater inflater; 
    private List<Item> items; 
    private Context context; 

    public ItemAdapter(Context context) { 
     super(); 
     inflater = LayoutInflater.from(context); 
     this.context = context; 
    } 

    public ItemAdapter(Context context, List<Item> items) { 
     super(); 
     inflater = LayoutInflater.from(context); 
     this.context = context; 
     this.items = items; 
    } 

    @Override 
    public int getCount() { 
     return items.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return items.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     convertView = inflater.inflate(R.layout.lv_row, parent, false); 
     TextView model = (TextView) convertView.findViewById(R.id.modelTV); 
     model.setText(items.get(position).toString()); 
     return convertView; 
    } 

    public void reloadItems(List<Item> items) { 
     this.items = items; 
     notifyDataSetChanged(); 
    } 
} 

그리고 활동 클래스에서이 어댑터를 사용하여 목록보기를 만듭니다

public class Item { 

    private String name; 
    private double lati; 
    private double longi; 

    public Item() { 

    } 

    public Item(String name, double lati, double longi) { 
     this.name = name; 
     this.lati = lati; 
     this.longi = longi; 
    } 

    public String getName() { 
     return name; 
    } 

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

    public double getLati() { 
     return lati; 
    } 

    public void setLati(double lati) { 
     this.lati = lati; 
    } 

    public double getLongi() { 
     return longi; 
    } 

    public void setLongi(double longi) { 
     this.longi = longi; 
    } 

    @Override 
    public String toString() { 
     return name + ", " + lati + ", " + longi; 
    } 
} 

그런 다음 어댑터 클래스를 확인합니다. 당신이 당신의 목록보기 데이터를 변경 어댑터의 reloadItems 메소드를 호출 할 때마다 :

public class MainActivity extends Activity { 

    private ListView lv; 
    private ItemAdapter adapter; 
    private List<Item> items; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     items = new ArrayList<Item>(); 
     items.add(new Item("Tom", 35.000001, 129.000001)); 
     items.add(new Item("Jane", 26.000001, 159.000001)); 
     items.add(new Item("Mary", 67.000001, 100.000001)); 
     adapter = new ItemAdapter(getApplicationContext(), items); 
     lv = (ListView) findViewById(R.id.list); 
     lv.setAdapter(adapter); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     // if list items changed reload items with newer 
     // by calling adapter.reloadItems(items); 
     // the best way to do it though, is to do it in separate thread, 
     // for example in asynctask 
     adapter.reloadItems(items); 
    } 
} 

이제 남은 건 오직이 MainActivity의과 목록보기 행에 대한 레이아웃을 생성하는 것입니다. MainActivity의 예 레이아웃, main.xml에 :

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Hello World, TestActivity" 
    /> 
    <ListView 
     android:id="@+id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
    />  
</LinearLayout> 

마지막 하나, 목록보기 행에 대한 레이아웃, lv_row.xml :

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"  
    android:padding="6dip" > 

    <TextView 
     android:id="@+id/modelTV" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:singleLine="false" 
     android:textSize="16sp" 
    /> 
</LinearLayout> 

그리고 매니페스트 파일, MainActivity 클래스를 포함하는 패키지 이름을 제공합니다

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="your package here" 
    android:versionCode="1" 
    android:versionName="1.0"> 
    <application android:label="@string/app_name" > 
    <activity 
     android:name="MainActivity" 
     android:label="Simple Listview"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    </application> 
</manifest> 

여기서 예를 들어 ItemAdapter 클래스는 필요하지 않습니다. 대신 기본 ArrayAdapter를 사용할 수 있습니다. 간단히 말해, 자체 어댑터를 제공하면 목록보기 데이터를 통해 더 많은 제어가 가능합니다. 자신의 모델을 포함하는 listview를 다룰 때 더 잘 생깁니다.

+0

감사합니다. 불행히도 당신이 제안한 것을 적용하기 위해 모든 것을 수정하더라도 아무런 변화가 없습니다. 이 문제를 해결하면 코드를 추가합니다. – Young

0

당신은 adapter.notifyDataSetChanged()를 호출합니다. 어댑터를 초기화하기 전에 ... 내가 생각하지 않는 다른 곳에서하지 않으면 예외가 발생한다고 생각합니다.

먼저 수정하고 코드를 다시 입력하십시오.

+0

나는 그것을 이해하기 위해 여러 가지 제안을했지만 아직도 풀리지 않았다. 점점 더 악화되고 있습니다. 모든 데이터 코드를 재구성하면 업로드 할 것입니다. 정말 감사. – Young

관련 문제