2015-03-23 2 views
0

Я знаю, что здесь было задано много раз, но абсолютно ничего не работает.Перезагрузка ListView, .notifyDataSetChanged не работает

У меня есть ListView, где он загружается, а затем нажатие кнопки, список меняется в файле, а затем мне нужно перезагрузить новые данные. В настоящее время он просто добавляет содержимое файла в конец старого списка, а не создает новый. Я понятия не имею, что я делаю неправильно, я пробовал boxAdapter.notifyDataSetChanged();, где boxAdapter привязывается к моему списку.

У меня есть метод, который я звоню, чтобы загрузить ListView

public void setUpPage(){ 

    fillData(); 

    boxAdapter = new ListAdapter(this, events); 
    ListView lvMain = (ListView) findViewById(R.id.lvMain); 
    lvMain.setAdapter(boxAdapter); 
    //boxAdapter.notifyDataSetChanged(); 
} 

Тогда в моем public void removeClick(View v) я звоню setUpPage(); Я попытался положить boxAdapter,notifyDataSetChanged(); в конце моего метода кнопки, но это не помогает либо , Любая помощь будет оценена по достоинству, может быть, я должен помещать notifydatasgetanged в другое место?

редактировать: полный listadapter:

public class ListAdapter extends BaseAdapter { 
Context ctx; 
LayoutInflater lInflater; 
ArrayList<Event> objects; 

ListAdapter(Context context, ArrayList<Event> events) { 
    ctx = context; 
    objects = events; 
    lInflater = (LayoutInflater) ctx 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

public void updateList(){ 
    notifyDataSetChanged(); 
} 

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

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

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

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = convertView; 
    if (view == null) { 
     view = lInflater.inflate(R.layout.list_item, parent, false); 
    } 

    Event p = getProduct(position); 

    ((TextView) view.findViewById(R.id.tvDescr)).setText(p.name); 
    ((TextView) view.findViewById(R.id.tvPrice)).setText(p.price + ""); 
    ((TextView) view.findViewById(R.id.description)).setText(p.description); 
    ((ImageView) view.findViewById(R.id.ivImage)).setImageResource(p.image); 

    CheckBox selectCB = (CheckBox) view.findViewById(R.id.selectBox); 
    selectCB.setButtonDrawable(R.drawable.unchecked); 
    selectCB.setOnCheckedChangeListener(myCheckChangList); 
    selectCB.setTag(position); 
    selectCB.setChecked(p.box); 
    return view; 
} 

Event getProduct(int position) { 
    return ((Event) getItem(position)); 
} 

ArrayList<Event> getBox() { 
    ArrayList<Event> box = new ArrayList<Event>(); 
    for (Event p : objects) { 
     if (p.box) 
      box.add(p); 

    } 
    return box; 
} 

OnCheckedChangeListener myCheckChangList = new OnCheckedChangeListener() { 
    public void onCheckedChanged(CompoundButton buttonView, 
           boolean isChecked) { 
     getProduct((Integer) buttonView.getTag()).box = isChecked; 

     if(buttonView.isChecked()) { 
      buttonView.setButtonDrawable(R.drawable.checked); 
     } 
     else{ 
      buttonView.setButtonDrawable(R.drawable.unchecked); 
     } 
    } 
}; 
} 

заполнения данных:

void fillData() { 
    String ret = ""; 
    try { 
     InputStream inputStream = openFileInput("UserEvents.txt"); 

     if (inputStream != null) { 
      InputStreamReader inputStreamReader = new InputStreamReader(inputStream); 
      BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 
      String receiveString = ""; 
      StringBuilder stringBuilder = new StringBuilder(); 

      while ((receiveString = bufferedReader.readLine()) != null) { 
       stringBuilder.append(receiveString); 

        String[] separated = receiveString.split("~"); 
        String event = separated[0]; // this will contain "name" 
        String eventloc = separated[1]; // this will contain the rest 
       try { 
        JSONArray mainNode = new JSONArray(loadJSONFromAsset()); // call the connection to json 
        if (mainNode != null) //puts the values into an array 
        { 
         for (int i = 0; i < mainNode.length(); i++) { 
          JSONObject eachObject = mainNode.getJSONObject(i); 

          String location = eachObject.getString("eventLocation"); 
          String eventtime = eachObject.getString("eventTime"); 
          String loctime = location + "  " + eventtime; 
          if(loctime.equals(eventloc)) 
          { 
           String eventdesc = eachObject.getString("eventDescription"); 
           int img = R.drawable.ic_launcher; //from here use event name as to which image to show 
           events.add(new Event(event, eventloc, eventdesc, img, false)); 
          } 

         } 
        } 
       } 
       catch (JSONException e) 
       { 
        e.printStackTrace(); 
       } 
      } 
      inputStream.close(); 
      ret = stringBuilder.toString(); 
     } 
    } catch (FileNotFoundException e) { 
     Log.e("h", "File not found: " + e.toString()); 
    } catch (IOException e) { 
     Log.e("h", "Can not read file: " + e.toString()); 
    } 
} 
+0

Вы используете 'Custom Adapter'? – hrskrs

+0

показать свой дополнительный код. –

+0

@hrskrs yep с использованием пользовательского адаптера – Navvy

ответ

0

Я хотел бы предложить вам создать public staticupdateList метод на ListAdapter как:

public void updateList(){ 
    yourAdapter.notifyDataSetChanged(); 
} 

и вызовите этот метод всякий раз, когда вы хотите обновить list

+0

Это прекратило добавлять их в конец предыдущего списка, но это не освежает должным образом. – Navvy

+0

@Navvy показать ваш код «Adapter» – hrskrs

+0

добавил весь код адаптера в – Navvy

0

Попробуйте это ..

runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      boxAdapter,notifyDataSetChanged(); 
     } 
    }); 
0

Здравствуйте, что я бы предложил в вашей точке. Не инициализируйте код ниже каждый раз, когда вы вызываете setUpPage().

boxAdapter = new ListAdapter(this, events); 
ListView lvMain = (ListView) findViewById(R.id.lvMain); 
lvMain.setAdapter(boxAdapter); 

Просто инициализируйте один раз на месте. Создайте метод действия или фрагмент. затем, когда у вас есть необработанные данные. В вашем случае вы читаете данные из «UserEvents.txt». После того как вы собрали все данные, просто добавьте список массивов, который вы создали. и см. код удара.

void fillData() { 
    String ret = ""; 
    try { 
     InputStream inputStream = openFileInput("UserEvents.txt"); 

     if (inputStream != null) { 
      InputStreamReader inputStreamReader = new InputStreamReader(inputStream); 
      BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 
      String receiveString = ""; 
      StringBuilder stringBuilder = new StringBuilder(); 

      while ((receiveString = bufferedReader.readLine()) != null) 
      { 
       stringBuilder.append(receiveString); 

        String[] separated = receiveString.split("~"); 
        String event = separated[0]; // this will contain "name" 
        String eventloc = separated[1]; // this will contain the rest 

       try { 
         JSONArray mainNode = new JSONArray(loadJSONFromAsset()); // call the connection to json 
         if (mainNode != null) //puts the values into an array 
         { 
          for (int i = 0; i < mainNode.length(); i++) { 
           JSONObject eachObject = mainNode.getJSONObject(i); 

           String location = eachObject.getString("eventLocation"); 
           String eventtime = eachObject.getString("eventTime"); 
           String loctime = location + "  " + eventtime; 
           if(loctime.equals(eventloc)) 
           { 
            String eventdesc = eachObject.getString("eventDescription"); 
            int img = R.drawable.ic_launcher; //from here use event name as to which image to show 
            events.add(new Event(event, eventloc, eventdesc, img, false)); 
           } 

          } 
         } 
       } 
       catch (JSONException e) 
       { 
        e.printStackTrace(); 
       } 
      } 

      inputStream.close(); 

      ret = stringBuilder.toString(); 
     } 
    } catch (FileNotFoundException e) { 
     Log.e("h", "File not found: " + e.toString()); 
    } catch (IOException e) { 
     Log.e("h", "Can not read file: " + e.toString()); 
    } 

    boxAdapter.notifyDataSetChanged(); 
} 

Также вы можете рассказать нам, как ваш базовый адаптер использует список массивов или список содержимого. было бы лучше, если бы вы показали адаптер.

Спасибо

+0

Просто отключает все приложение – Navvy

+0

, что вы сделали, вы написали код на создание поля activityAdapter = new ListAdapter (это, события); ListView lvMain = (ListView) findViewById (R.id.lvMain); lvMain.setAdapter (boxAdapter); –

+0

Нет, как вы писали выше, я разместил его там – Navvy

Смежные вопросы