【问题标题】:how to refresh my gridView?如何刷新我的gridView?
【发布时间】:2013-05-01 10:07:21
【问题描述】:

我有一个ListView。当我单击列表视图行的按钮时,将在main.xml 中创建一个按钮,我在自定义列表视图适配器中拥有该按钮的onclicklistener。我在 sqlite 中保存了对该按钮的单击,并通过该 sqlite 更新了 gridview 适配器。

所以我的问题是,当我单击按钮时,GridView 不会自行更新,当我关闭应用程序并再次打开它时,它会更新。

我尝试使用notifydatasetchanged(),但没有成功..

这是自定义列表视图适配器中的代码

holder.checkbox.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
             String text = holder.tvName.getText().toString();
             String image = holder.tvimageurl.getText().toString();
             DatabaseHandler db = new DatabaseHandler(activity);
             db.addContact(new Contact(text, image));  
             db.close();

这在主活动中

    GridView listView = (GridView) findViewById(R.id.gridview1);
    imgAdapter = new ImageAdapter(this);
    listView.setAdapter(imgAdapter);
    imgAdapter.notifyDataSetChanged();

ImageAdapter 代码。

public class ImageAdapter extends BaseAdapter {

    Activity activity;
    List<Contact> item;
    LayoutInflater inflater;
    ImageAdapter imgAdapter;
    private DisplayImageOptions options;
    private DisplayImageOptions options2;
    ImageLoader imageLoader;
    private Contact objBean;
    String getUrl,getId;
    ObjectOutputStream oos;
    FileOutputStream fos;



    public ImageAdapter(Activity act) {
        this.activity=act;

        inflater = act.getLayoutInflater();


        DatabaseHandler db = new DatabaseHandler(activity);
        item = db.getAllContacts();
        db.close();
}

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

    @Override
    public Contact getItem(int position) {
        return null;
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final LinearLayout imageView;
        if (convertView == null) {
            imageView = (LinearLayout)        inflater.inflate(R.layout.item_grid_image, parent, false);
        } else {
            imageView = (LinearLayout) convertView;
        }

【问题讨论】:

    标签: android listview button refresh


    【解决方案1】:

    您可以强制 Adapter 在您的 onClick 方法中自行更新,例如

    public void onClick(View v) {
        String text = holder.tvName.getText().toString();
        String image = holder.tvimageurl.getText().toString();
        DatabaseHandler db = new DatabaseHandler(activity);
        db.addContact(new Contact(text, image));
        db.close();
        notifyDataSetChanged(); // This will do the trick
     }
    

    编辑

    由于您在重新启动时获取数据,这意味着它肯定会保存在数据库中,这表明当您使Adapter 无效时,它不会重新加载数据库。在ImageAdapter 中尝试像这样的自定义方法:

    public void onClick(View v) {
        String text = holder.tvName.getText().toString();
        String image = holder.tvimageurl.getText().toString();
        DatabaseHandler db = new DatabaseHandler(activity);
        db.addContact(new Contact(text, image));
        db.close();
        reloadData();  // will refresh the data
        notifyDataSetChanged(); // will update the contents
     }
    
    private void reloadData() {
        DatabaseHandler db = new DatabaseHandler(activity);
        item = db.getAllContacts();
        db.close();
    }
    

    【讨论】:

    • 也试过了,但效果很好..它确实有效,但在我重新启动我的应用程序后
    【解决方案2】:

    在调用 notifyDataSetChanged 之前,您需要先向 ImageAdapter 添加数据。或者重新创建它并再次设置为您的 GridView

    更新: 好的,然后将加载代码放在 ImageAdapter 中的单独方法中,并在添加新数据后调用刷新

    public ImageAdapter(Activity act) {
            this.activity=act;
    
            inflater = act.getLayoutInflater();
            refresh();
    }
    
    void refresh()
    {
            DatabaseHandler db = new DatabaseHandler(activity);
            item = db.getAllContacts();
            db.close();
            notifyDatasetChanged();
    }
    

    但最好在单击按钮时手动将新联系人添加到 ImageAdapter

    public void onClick(View v) {
        String text = holder.tvName.getText().toString();
        String image = holder.tvimageurl.getText().toString();
        DatabaseHandler db = new DatabaseHandler(activity);
        Contact contact = new Contact(text, image)
        db.addContact(contact);  
        db.close();
        imgAdapter.addItem(contact)
        imgAdapter.notifyDatasetChanged();
    }
    

    【讨论】:

    • 我在不同的适配器中完成了,该适配器用于 gridVIew
    • 向我们展示ImageAdapter的代码。最重要的是,当您将其添加到数据库时,您不会向其中添加数据
    • 似乎代码被截断了。我没有看到加载部分。无论如何,您需要先将新数据添加到项目字段,然后调用 notifyDatasetChanged
    • 之前我直接更新它,但它没有被存储,我的意思是当我关闭应用程序时它全部消失,这就是我使用 sqlite 存储数据的原因。
    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    相关资源
    最近更新 更多