适配器的内容已更改,但listview未收到通知

时间:2014-09-05 06:27:42

标签: android

我对此进行了很多研究,但没有什么能让我满意。每个人都给我一个解决方案,将 adapter.notifyDataSetChanged()放在runOnUiThread中,我已经完成了比特,我没有给我解决方案。 我的代码低于 公共类FragmentActivity3扩展了Fragment {

// 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();
                }
            });
        }

    }

}

我的适配器类位于

之下
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 个答案:

答案 0 :(得分:0)

在UI线程上自动调用

onPostExecute(),因此您不需要runOnUIThread()

您是否检查过以确保列表中的数据实际发生变化?此外,我没有通过整个适配器的逻辑,但这条线看起来像是一个错字。我猜你的IDE会抓住它,如果那个拼写错误也不在你的资源文件中 linearMain = (LinearLayout) row.findViewById(R.id.lineraMain); 不确定错误R.id.lineraMain是否会导致您出现问题。