2013-03-19 13 views
1

修改這個錯誤在我的logcat顯示適配器的內容發生了變化,但ListView控件沒有收到notification.content適配器沒有從後臺線程

03-19 12:48:54.527: E/AndroidRuntime(2066): java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(2131165193, class android.widget.ListView) with Adapter(class com.example.recipestutors.ItemListBaseAdapter)] 

Itemlistadapter.java

ublic class ItemListBaseAdapter extends BaseAdapter { 
private static ArrayList<Recipedetails> itemDetailsrrayList; 

private Integer[] imgid = { 
       R.drawable.vegeterian, 
       R.drawable.nonveg, 
       R.drawable.pickels, 
       R.drawable.soup, 
       R.drawable.sweets, 
       R.drawable.cakes, 
       R.drawable.icecreams, 
       R.drawable.chinesevegdishes, 
       R.drawable.chinesenonveg, 
       R.drawable.chinesenoodles, 
       R.drawable.chinesesoup, 
       R.drawable.godhumaivegadai, 
       R.drawable.soyamorekoozh, 
       R.drawable.tomatokulambu, 
       R.drawable.tomatoupma, 
       R.drawable.vadanavratrispecial, 
       R.drawable.eggkurma, 
       R.drawable.milagu, 
       R.drawable.rasam, 
       R.drawable.vegetablekootu, 
       R.drawable.avial, 
       R.drawable.kothavarangaicurry, 
       R.drawable.allepeyfishcurry, 
       R.drawable.spicymadraschicken, 
       R.drawable.prawns, 
       R.drawable.keralachickenstew, 
       R.drawable.nilgirichickenkorma, 
       R.drawable.pepperchickencurry, 
       R.drawable.chettiandchicken, 
       R.drawable.prawnmasala, 
       R.drawable.beeffry, 
       R.drawable.crispyfish, 
       R.drawable.amlapickle, 
       R.drawable.avakaipickle, 
       R.drawable.capsicumpickle, 
       R.drawable.lemonpickle, 
       R.drawable.onionpickle, 
       R.drawable.mangopickle, 
       R.drawable.tendermangopickle, 
       R.drawable.tomatopickle, 
       R.drawable.chillipickles, 
       R.drawable.gingerpickle, 
       R.drawable.garlicsoup, 
       R.drawable.mixedvegsoup, 
       R.drawable.chickenmanchowsoup, 
       R.drawable.cleartomatosoup, 
       R.drawable.sweetcornvegetablesoup, 
       R.drawable.prawnandnoodlesoup, 
       R.drawable.beetrootsoup, 
       R.drawable.capsicumsoup, 
       R.drawable.muttonsoup, 
       R.drawable.spinachsoup, 
       R.drawable.vegcurry, 
       R.drawable.mushroommutter, 
       R.drawable.alooparatha, 
       R.drawable.daltadka, 
       R.drawable.aloomethi, 
       R.drawable.rajma, 
       R.drawable.paneerbhujri, 
       R.drawable.alooghobi, 
       R.drawable.aloosabzi, 
       R.drawable.kadhaipaneer, 
       R.drawable.chickenwithbellpeppers, 
       R.drawable.butterchicken, 
       R.drawable.fishkorma, 
       R.drawable.prawnfry, 
       R.drawable.tandoorichicken, 
       R.drawable.maccherjholfish, 
       R.drawable.shamikabab, 
       R.drawable.saagmeat, 
       R.drawable.sindhichickenbiryani, 
       R.drawable.punjabichickencurry, 
       R.drawable.gulabjamun, 
       R.drawable.basundi, 
       R.drawable.peda, 
       R.drawable.badhamhalwa, 
       R.drawable.coconutburfi, 
       R.drawable.kulfi, 
       R.drawable.ladoo, 
       R.drawable.mysorepak, 
       R.drawable.ricekheer, 
       R.drawable.badam, 
       R.drawable.cauliflowersoup, 
       R.drawable.cucumbersoup, 
       R.drawable.tomatosoup, 
       R.drawable.mulligatawnysoup, 
       R.drawable.greenpeassoup, 
       R.drawable.northindianmuttonsoup, 
       R.drawable.chickennoodlesoup, 
       R.drawable.spicybeansoup, 
       R.drawable.eggdropsoup, 
       R.drawable.springvegsoup, 
       R.drawable.mushroomandseitan, 
       R.drawable.tofuwith3spices, 
       R.drawable.creamyvegpie, 
       R.drawable.grilledvegmedley, 
       R.drawable.bakedsquash, 
       R.drawable.africanchickenstew, 
       R.drawable.westafricanchicken, 
       R.drawable.africanyamsoup, 
       R.drawable.chickenchilliroast, 
       R.drawable.chilliblackbeans, 
       R.drawable.williecake, 
       R.drawable.pumpkingingercupcakes, 
       R.drawable.doublelayerpumpkincheesecake, 
       R.drawable.carrotcake, 
       R.drawable.sexcake, 
       R.drawable.chocolatechipicecream, 
       R.drawable.cookieicecream, 
       R.drawable.cinnamonicecream, 
       R.drawable.appleicecream, 
       R.drawable.walnut, 
       R.drawable.chineseaubergins, 
       R.drawable.spicycucumber, 
       R.drawable.chinesemushrooms, 
       R.drawable.chinesegobi, 
       R.drawable.spicytofu, 
       R.drawable.chinesetilchicken, 
       R.drawable.chickenmoongali, 
       R.drawable.sweetsourchicken, 
       R.drawable.cherrychicken, 
       R.drawable.mymasalachicken, 
       R.drawable.coldseasamenoodles, 
       R.drawable.sobanoodles, 
       R.drawable.noodleswithtofu, 
       R.drawable.chinesevegandbeef, 
       R.drawable.noodleswithpepper, 
       R.drawable.jhingasoup, 
       R.drawable.masalachickensoup, 
       R.drawable.cabbagesoup, 
       R.drawable.chinesepumpkinsoup, 
       R.drawable.baconsoup, 


       }; 



private LayoutInflater l_Inflater; 

public ItemListBaseAdapter(Context context, ArrayList<Recipedetails> results) { 
     itemDetailsrrayList = results; 
     l_Inflater = LayoutInflater.from(context); 
} 

public int getCount() { 
     return itemDetailsrrayList.size(); 
} 

public Object getItem(int position) { 
     return itemDetailsrrayList.get(position); 
} 

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

public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
       convertView = l_Inflater.inflate(R.layout.item_details_view, null); 
       holder = new ViewHolder(); 
       holder.txt_itemName = (TextView) convertView.findViewById(R.id.name); 
       holder.txt_itemDescription = (TextView) convertView.findViewById(R.id.itemDescription); 
       holder.itemImage = (ImageView) convertView.findViewById(R.id.photo); 

       convertView.setTag(holder); 
     } else { 
       holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.txt_itemName.setText(itemDetailsrrayList.get(position).getName()); 
     holder.txt_itemDescription.setText(itemDetailsrrayList.get(position).getItemDescription()); 
     holder.itemImage.setImageResource(imgid[itemDetailsrrayList.get(position).getImageNumber() - 1]); 
     return convertView; 
} 
public synchronized void refreshAdapter(ArrayList<Recipedetails> items) { 
    itemDetailsrrayList.clear(); 
    itemDetailsrrayList.addAll(items); 
    notifyDataSetChanged(); 
} 

static class ViewHolder { 
     TextView txt_itemName; 
     TextView txt_itemDescription; 
     ImageView itemImage; 
} 
}  

soutindian.java

public class SouthIndian extends Activity { 
ItemListBaseAdapter _itemListAdapter; 
@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     ArrayList<Recipedetails> image_details = new ArrayList<Recipedetails>(); 

     _itemListAdapter = new ItemListBaseAdapter(this, image_details); 

     final ListView lv1 = (ListView) findViewById(R.id.listV_main); 
     lv1.setAdapter(_itemListAdapter); 

     lv1.setOnItemClickListener(new OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
         Object o = lv1.getItemAtPosition(position); 
         Recipedetails obj_itemDetails = (Recipedetails)o; 
         Toast.makeText(SouthIndian.this, "You have chosen : " + " " +  obj_itemDetails.getName(), Toast.LENGTH_LONG).show(); 

         switch(obj_itemDetails.getImageNumber()) 
         { 
          case 1: 
           Intent newActivity = new Intent(SouthIndian.this, 
               AndroidTabLayoutActivity.class);  
        startActivity(newActivity); 
           break; 

          case 2: 
           Intent new1Activity = new Intent(SouthIndian.this, 
               AndroidTabLayoutActivity1.class);  
          startActivity(new1Activity); 
           break; 

          case 3: 
           Intent new2Activity = new Intent(SouthIndian.this, 
               AndroidTabLayoutActivity2.class);  
          startActivity(new2Activity); 
           break; 

          case 4: 
           Intent new3Activity = new Intent(SouthIndian.this, 
               AndroidTabLayoutActivity3.class);  
          startActivity(new3Activity); 
           break;   

          default: 
            Toast.makeText(SouthIndian.this, "Wrong Input", Toast.LENGTH_LONG).show(); 
         } 

       } 
     }); 

     refreshYourAdapter(GetSearchResults()); 
    } 

    // THIS IS WHAT IT SHOULD LOOK LIKE MORE OR LESS. THIS IS AS MUCH AS I CAN HELP 

    private void refreshYourAdapter(final ArrayList<Recipedetails> newData) { 
     //this is what I meant. The error clearly states you are not updating the adapter on the UI thread 
     runOnUiThread(new Runnable() { 
      public void run() { 
       _itemListAdapter.refreshAdapter(newData); 
      } 
     }); 
    } 

    private ArrayList<Recipedetails> GetSearchResults(){ 
     ArrayList<Recipedetails> results = new ArrayList<Recipedetails>(); 

     Recipedetails item_details = new Recipedetails(); 
     item_details.setName("Vegterian"); 
     item_details.setItemDescription("Recipes made by raw materials"); 
      item_details.setImageNumber(1); 
     results.add(item_details); 

     item_details = new Recipedetails(); 
     item_details.setName("Non-Vegterian"); 
     item_details.setItemDescription("Flesh of sweet animals"); 
     item_details.setImageNumber(2); 
     results.add(item_details); 

     item_details = new Recipedetails(); 
     item_details.setName("Pickels"); 
     item_details.setItemDescription("Touchable dish by Homemade"); 
     item_details.setImageNumber(3); 
     results.add(item_details); 

     item_details = new Recipedetails(); 
     item_details.setName("Soups"); 
     item_details.setItemDescription("Startup for our food"); 
      item_details.setImageNumber(4); 
     results.add(item_details); 

     return results; 
    } 
}  

Northindian.java

public class NorthIndian extends Activity { 
ItemListBaseAdapter _itemListAdapter; 


@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     ArrayList<Recipedetails> image_details = new ArrayList<Recipedetails>(); 

     _itemListAdapter = new ItemListBaseAdapter(this, image_details); 

     final ListView lv1 = (ListView) findViewById(R.id.listV_main); 
     lv1.setAdapter(_itemListAdapter); 

     lv1.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
       Object o = lv1.getItemAtPosition(position); 
       Recipedetails obj_itemDetails = (Recipedetails)o; 
       Toast.makeText(NorthIndian.this, "You have chosen : " + " " + obj_itemDetails.getName(), Toast.LENGTH_LONG).show(); 

       switch(obj_itemDetails.getImageNumber()) 
       { 
        case 1: 
         Intent newActivity = new Intent(NorthIndian.this, 
           AndroidTabLayoutActivity4.class);  
         startActivity(newActivity); 
         break; 

        case 2: 
         Intent new1Activity = new Intent(NorthIndian.this, 
           AndroidTabLayoutActivity5.class);  
         startActivity(new1Activity); 
         break; 

        case 5: 
         Intent new2Activity = new Intent(NorthIndian.this, 
           AndroidTabLayoutActivity6.class);  
         startActivity(new2Activity); 
         break; 

        case 4: 
         Intent new3Activity = new Intent(NorthIndian.this, 
           AndroidTabLayoutActivity7.class);  
         startActivity(new3Activity); 
         break;  

        default: 
         Toast.makeText(NorthIndian.this, "Wrong Input", Toast.LENGTH_LONG).show(); 
       } 
      } 
     }); 
     refreshYourAdapter(GetSearchResults()); 
    } 
    private void refreshYourAdapter(final ArrayList<Recipedetails> newData) { 
     //this is what I meant. The error clearly states you are not updating the adapter on the UI thread 
     runOnUiThread(new Runnable() { 
      public void run() { 
       _itemListAdapter.refreshAdapter(newData); 
      } 
     }); 
} 

    private ArrayList<Recipedetails> GetSearchResults(){ 
     ArrayList<Recipedetails> results = new ArrayList<Recipedetails>(); 

     Recipedetails item_details = new Recipedetails(); 
     item_details.setName("Vegterian"); 
     item_details.setItemDescription("Recipes made by raw materials"); 
     item_details.setImageNumber(1); 
     results.add(item_details); 

     item_details = new Recipedetails(); 
     item_details.setName("Non-Vegterian"); 
     item_details.setItemDescription("Flesh of sweet animals"); 
     item_details.setImageNumber(2); 
     results.add(item_details); 

     item_details = new Recipedetails(); 
     item_details.setName("Sweets"); 
     item_details.setItemDescription("Tasty sweets made from indians"); 
     item_details.setImageNumber(5); 
     results.add(item_details); 

     item_details = new Recipedetails(); 
     item_details.setName("Soups"); 
     item_details.setItemDescription("Startup for our food"); 
     item_details.setImageNumber(4); 
     results.add(item_details); 




     return results; 
    } 
}  

點擊第一次在listview後,它會進入函數,如果我們再次回來點擊列表視圖中的下一個項目,它會顯示我的應用程序已經停止。 我的問題不解決,我試圖

+0

問題解決了嗎? – Kanth 2013-03-19 14:03:42

+0

可能的重複[如何使用adapter.notifyDataSetChanged();我必須使用這些行爲我的錯誤](http://stackoverflow.com/questions/15491876/how-to-use-adapter-notifydatasetchanged-where-i-have-to-use-these-line-for-我) – Luksprog 2013-03-19 14:56:32

+0

我也嘗試過這些方法,它不工作 – kkarthickk 2013-03-20 04:24:20

回答

0

兩個代碼需要 我們listadapter

public synchronized void refreshAdapter(ArrayList<Recipedetails> items) { 
     //itemDetailsrrayList.clear(); 
     itemDetailsrrayList = items; 
     notifyDataSetChanged(); 
    } 

的所有方式與我們的ListView活動也

private void refreshYourAdapter(final ArrayList<Recipedetails> items) { 
//this is what I meant. The error clearly states you are not updating the adapter on the UI thread 
runOnUiThread(new Runnable() { 
public void run() { 
_itemListAdapter.refreshAdapter(items); 
} 
}); 
} 

和一個更多的代碼也在列表視圖

@Override 
    protected void onResume() { 
    super.onResume(); 
    results = new ArrayList<Recipedetails>(); 
    _itemListAdapter = new ItemListBaseAdapter(this, image_details); 
    refreshYourAdapter(GetSearchResults()); 
    lv1.setAdapter(_itemListAdapter); 

    } 
相關問題