【问题标题】:Reloading ListView, .notifyDataSetChanged not working重新加载 ListView,.notifyDataSetChanged 不起作用
【发布时间】:2015-03-23 12:42:27
【问题描述】:

我知道这个问题已经被问过很多次了,但似乎没有任何效果。

我有一个 ListView,正在加载它,然后单击按钮,列表正在文件中更改,然后我需要重新加载新数据。目前,它只是将文件内容添加到旧列表的末尾,而不是创建新列表。我不知道我做错了什么,我试过 boxAdapter.notifyDataSetChanged(); boxAdapter 链接到我的 ListAdapter。

我有一个方法,我正在调用它来加载列表视图

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(); 放在按钮方法的末尾,但这也无济于事。任何帮助将不胜感激,也许我应该将 notifydatasetchanged 放在其他地方?

编辑: 完整的列表适配器:

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

【问题讨论】:

  • 你在用Custom Adapter吗?
  • 显示您的列表添加代码。
  • @hrskrs 是的,使用自定义适配器

标签: android listview listadapter


【解决方案1】:

试试这个..

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

【讨论】:

    【解决方案2】:

    您好,我会在您的观点中提出什么建议。每次调用 setUpPage() 时不要初始化下面的代码。

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

    只需在活动或片段的 Create 方法中初始化一次。然后当你有可用的原始数据时。在您的情况下,您从“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();
    } 
    

    您还可以告诉我们您的基本适配器如何使用数组列表或内容列表。如果您显示适配器会更好。

    谢谢

    【讨论】:

    • 只是让整个应用程序崩溃
    • 你实现了什么,你在创建活动 boxAdapter = new ListAdapter(this, events); 时写了代码吗? ListView lvMain = (ListView) findViewById(R.id.lvMain); lvMain.setAdapter(boxAdapter);
    • 不是你上面写的我把它放在那里
    【解决方案3】:

    我建议你在ListAdapter 上创建一个public static updateList 方法,例如:

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

    并在您想要更新您的list时调用此方法

    【讨论】:

    • 已停止将它们添加到上一个列表的末尾,但仍无法正常刷新。
    • @Navvy 将 public void updateList 更改为 public static void updateList,当您想要 trigger 时,将其称为 ListAdapter.updateList();
    • notifyDataSetChanged 不能从静态上下文中引用
    猜你喜欢
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    相关资源
    最近更新 更多