2014-09-05 1 views
1

У меня много исследований по этому вопросу, но ничто не удовлетворяет меня. Все дают мне решение: adapter.notifyDataSetChanged() в runOnUiThread, который я уже сделал бит didi не дал мне решение. Мой код ниже общественного класса FragmentActivity3 расширяет фрагмент {Содержимое адаптера изменилось, но listview не получил уведомление

// Hashmap for ListView 
ArrayList<Item> imageArry = new ArrayList<Item>(); 
CustomQuoteAdapter adapter; 
String jsonstring; 
@Override 
public View onCreateView(LayoutInflater inflater, 
     ViewGroup container, Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    View rootView=inflater.inflate(R.layout.activity_fragment_activity1, container,false); 
    jsonstring=JsonClass.readData(); 
    Log.d("JSon String ",jsonstring); 
    new GetQuotesInfo().execute(); 
    adapter = new CustomQuoteAdapter(getActivity(), R.layout.list, imageArry); 
    ListView dataList = (ListView) rootView. findViewById(R.id.list); 
    dataList.setAdapter(adapter); 
    return rootView; 
} 

//Async Task to load data 
    class GetQuotesInfo extends AsyncTask<Void, Void, Void> 
    { 
     int count; 
     @Override 
     protected Void doInBackground(Void... arg0) { 
      // TODO Auto-generated method stub 
      try { 
       JSONArray jsonarr=new JSONArray(Globals.jsonText); 
       count=jsonarr.length(); 
       for(int i=0;i<count;i++) 
       { 
        HashMap<String, String> quoteinfo = new HashMap<String, String>(); 
        String author=""; 
        Log.d("Json","Reading"); 
        JSONObject jsonobj=jsonarr.getJSONObject(i); 
        String name=jsonobj.getString("name"); 
        quoteinfo.put("name", name); 
        JSONArray jarr=jsonobj.getJSONArray("quotes"); 
        String[] myarr=new String[jarr.length()]; 
        String[] myarr1=new String[jarr.length()]; 
        for(int j=0;j<jarr.length();j++) 
        { 


         JSONObject jobj=jarr.getJSONObject(j); 
         author=jobj.getString("author"); 
         String text=jobj.getString("text"); 
         Log.d("Author ",author); 
         Log.d("Text ",text); 
         myarr[j]=text; 
         myarr1[j]=author; 
        } 

        imageArry.add(new Item(name,myarr1, myarr)); 

       } 

      } 
      catch(Exception ex) 
      { 

     } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 
      getActivity().runOnUiThread(new Runnable(){ 
       public void run() { 
        adapter.notifyDataSetChanged(); 
       } 
      }); 
     } 

    } 

}

Мой класс Adapter ниже

public class CustomQuoteAdapter extends ArrayAdapter<Item> { 
    Context context; 
    int layoutResourceId; 
    LinearLayout linearMain; 
    ArrayList<Item> data = new ArrayList<Item>(); 

    public CustomQuoteAdapter(Context context, int layoutResourceId, 
      ArrayList<Item> data) { 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 

     if (row == null) { 
      LayoutInflater inflater = ((FragmentActivity) context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      linearMain = (LinearLayout) row.findViewById(R.id.lineraMain); 
      Item myImage = data.get(position); 
      TextView txtview=new TextView(context); 
      String heading=myImage.heading; 
      txtview.setText(heading); 
      txtview.setTextColor(Color.BLUE); 
      txtview.setTextSize(20); 
      linearMain.addView(txtview); 

      for (int j = 0; j < myImage.getName().length; j++) { 
       TextView label1 = new TextView(context); 
       label1.setText(myImage.author[j]); 
       linearMain.addView(label1); 
       TextView label2 = new TextView(context); 
       label2.setText(myImage.name[j]); 
       linearMain.addView(label2); 
      } 
//   ImageView image = new ImageView(context); 
//   int outImage = myImage.image; 
//   image.setImageResource(outImage); 
//   linearMain.addView(image); 
     } 

     return row; 

    } 

} 

Может кто-нибудь дать мне решение разрешить мой ошибка

+1

удалите runOnUIthread из вашей асинтезмы, что вам не нужно, и используйте ex.printStackTrace() в json. Недопустимым json может быть причина –

+0

вам следует избегать использования notifyDataSetChanged в onPostExecute. Предпочитаете создать метод обратного вызова, предназначенный для обновления вашего адаптера. Также getActivity() может быть нулевым, в некоторых случаях следует соблюдать осторожность при его использовании. –

ответ

0

onPostExecute() автоматически вызывается в потоке пользовательского интерфейса, так что вам не нужен runOnUIThread()

Вы проверили, чтобы убедиться, что данные в вашем списке на самом деле меняется? Также я не прошел логику всего вашего адаптера, но эта строка выглядит как опечатка. Я предполагаю, что ваша IDE поймала бы его, если бы эта опечатка не была также в вашем файле ресурсов, хотя linearMain = (LinearLayout) row.findViewById(R.id.lineraMain); Не уверен, что эта опечатка R.id.lineraMain вызывает у вас проблемы.

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

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