当前位置: 首页 > 知识库问答 >
问题:

如何刷新我的gridView?

司空鸣
2023-03-14

我有一个ListView。当我单击listview行的按钮时,将在main中创建一个按钮。xml,我有定制listView适配器中按钮的onclicklistener。我将该按钮的点击保存在sqlite中,通过该sqlite,我将更新gridview适配器。

因此,我的问题是,当我单击按钮时,GridView本身不会更新,当我关闭应用程序并再次打开时,它会更新。

我尝试使用notefydatasetchange(),但不起作用。

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

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

共有2个答案

魏景龙
2023-03-14

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

UPD:好的,然后将加载代码放在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();
}

但是,最好在单击按钮时手动将新联系人添加到映像适配器中

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();
}
邵畅
2023-03-14

您可以强制< code >适配器在< code>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
 }

编辑

当您在重新启动时获取数据时,这意味着它肯定保存在数据库中OK,这表明当您使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();
}
 类似资料:
  • 我用碎片制作了一个mediaplayer应用程序;歌曲、专辑、艺术家、流派、播放列表 这是我的一个片段中的代码,我将以艺术家为例 在我的initRecyClaire View()方法中,我有一个名为“项目”的数组列表,其中包含歌曲艺术家。Main.songs.get艺术家- 现在,当用户点击一个艺术家时,另一个活动将启动ListSong sActivity.java 这是类中的代码ListSong

  • 问题内容: 我有一个与Java有关的一般性问题。 我正在编写具有GUI菜单的应用程序。我试图根据对单选按钮的选择来更改GUI菜单的一部分。 我需要: 重新绘制整个窗口,或仅使用以下内容更新该部分: 如果我只是使用上面#1中的语句,那么GUI很好-直到将鼠标移到它上面,然后我才看到先前的按钮选择。我究竟做错了什么? 问题答案: Swing组件具有repaint(),revalidate()和doLa

  • 问题内容: 您如何“忘记”以前的地块 我正在尝试使用绘制多个时间 代码如下: 不幸的是,无论我做什么,我都会得到相同的情节(实际上是从我之前运行并完成的其他代码中得到的)。 有任何想法吗? 问题答案: 我宁愿每次都使用它来 清除当前图形, 而不是关闭并重新打开它,以保持窗口大小并为您提供更好的性能和更好的内存使用率。 同样,您可以 清除当前 轴。 要清除特定的轴(例如,在一个图形中有多个轴时很有用

  • 问题内容: 我要刷新温斯顿记录仪 前 。 有没有类似的东西?除了人们抱怨温斯顿没有得到非常积极的维护之外,我什么也找不到。 作为替代方案,是否有任何流行的(主动维护的)多传输日志记录框架提供冲洗功能? 问题答案: 实际上,Winston允许您传递在记录所有传输后执行的回调: 文件:https://github.com/flatiron/winston#events-and-callbacks-in

  • 问题内容: 我有一个click事件发生在我的自定义指令范围之外,因此,我使用jQuery.click()侦听器并在我的范围内调用一个函数,而不是使用“ ng- click”属性,如下所示: close()是一个简单的函数,如下所示: 在我看来,我有一个绑定到isOpen的“ ng-show”元素,如下所示: 调试时,我发现正在调用close(),isOpen被更新为false,但是AngularJ

  • 如何刷新__consumer_offsets主题? 我刚刚设置了offsets.retention.minutes=1,重新启动了代理,检查了offsets.retention.minutes=1的日志,但是__consumer_offsets主题的50个分区的大小仍然相同。 为什么?