添加数据库后填充listview

Posted

技术标签:

【中文标题】添加数据库后填充listview【英文标题】:Populate listview after the addition of database 【发布时间】:2015-08-31 00:04:57 【问题描述】:

我有一个在片段中显示数据的应用程序(使用网络服务)。 登录后,片段从 json 中获取数据并添加到数据库中,之后我想将其填充到我的片段中。添加数据库后,我的片段没有显示任何内容。

public class GridFragment extends Fragment 
Context mContext;
GridView gridd;
GridAdapter adapter;
MagazineGetIssues mgi;
ArrayList<DataVal> Issues = new ArrayList<>();

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    mContext = getActivity();
    mgi = new MagazineGetIssues();
    DBOperation db = new DBOperation(getActivity());
    Issues = db.getIssues();
    adapter = new GridAdapter(getActivity(), Issues);


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    View rootView = inflater.inflate(R.layout.fragment_grid, container, false);
    gridd = (GridView) rootView.findViewById(R.id.gridViewAA);
    gridd.setAdapter(adapter);
    //getting Issues
    mgi.getIssues(mContext);
    adapter.addList(Issues);
    return rootView;
  

GridAdapter 类

public class GridAdapter extends BaseAdapter 

private final FragmentActivity activity;
ImageLoaderConfiguration imageLoaderConfiguration;
DisplayImageOptions displayImageOptions;
String url = "";
DisplayImageOptions imageOptions;
ImageLoader imLoad;
ArrayList<DataVal> issueList = null;

public GridAdapter(FragmentActivity activity, ArrayList<DataVal> cdate) 
    this.activity = activity;
    this.issueList = cdate;

    displayImageOptions = new DisplayImageOptions.
            Builder().cacheOnDisk(true).cacheInMemory(true)
            .imageScaleType(ImageScaleType.EXACTLY)
            .displayer(new FadeInBitmapDisplayer(300))
            .build();
    imageLoaderConfiguration = new ImageLoaderConfiguration.Builder(activity)
            .defaultDisplayImageOptions(displayImageOptions).memoryCache(new WeakMemoryCache())
            .discCacheSize(100 * 1024 * 1024).build();
    ImageLoader.getInstance().init(imageLoaderConfiguration);
    imLoad = ImageLoader.getInstance();
    imageOptions = new DisplayImageOptions.Builder().cacheInMemory(true).cacheOnDisk(true).resetViewBeforeLoading(true).build();




@Override
public int getCount() 
    return issueList.size();


@Override
public Object getItem(int position) 
    return null;


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


@Override
public View getView(int position, View convertView, ViewGroup parent) 
    ViewHolder viewHolder;
    if (convertView == null) 
        LayoutInflater inflator = activity.getLayoutInflater();
        convertView = inflator.inflate(R.layout.grid_single, null);
        viewHolder = new ViewHolder();
        viewHolder.imView = (ImageView) convertView.findViewById(R.id.CoverPic);
        viewHolder.iss_date = (TextView) convertView.findViewById(R.id.issuedate);
        viewHolder.iss_price = (TextView) convertView.findViewById(R.id.price);
        convertView.setTag(viewHolder);

     else 
        viewHolder = (ViewHolder) convertView.getTag();
    

    viewHolder.iss_date.setText(issueList.get(position).getISSUE_DATE());
    viewHolder.iss_price.setText(issueList.get(position).getPRICE());
    imLoad.displayImage(url + issueList.get(position).getCOVER_PAGE_THUMB(), viewHolder.imView, imageOptions);
    return convertView;


public void addList(ArrayList<DataVal> val) 
    this.issueList = val;
    this.notifyDataSetChanged();


static class ViewHolder 
    protected TextView iss_date;
    protected TextView iss_price;
    protected ImageView imView;
  

【问题讨论】:

问题列表是否包含任何数据? 是的。我在 loginactivity 中也进行了同样的测试(在登录时向 db 添加数据并填充到片段中) 【参考方案1】:

尝试替换这一行

 this.issueList = val;

this.issueList.clear();
this.issueList.addAll(val);

在你的BaseAdapter

【讨论】:

为什么不能替换上面的行?【参考方案2】:

更改您的适配器以扩展 ArrayAdapter 并在您的适配器类启动时将您的列表传递给 ArrayAdapter 的超级构造函数

添加到列表后不要忘记调用 notifyDataSetChanged()。

希望这会有所帮助。

【讨论】:

【参考方案3】:

您必须在 BaseAdapter添加一个方法来更新新数据:

ArrayList<DataVal> issueList = null;

设置新方法 setUpdatedData 来分配新的 Arraylist 数据

 public void setUpdatedData(ArrayList<DataVal> newData)
    this.issueList = newData;
   

设置新数据后,您必须调用 notifyDataSetChanged();

adapter.notifyDataSetChanged();

完成

【讨论】:

还是不行。我认为 GridFragment 类有问题 @shine_joseph,您是否从数据库中获取更新的数据,可能您再次获取相同的数据,请告诉我。 列表在我重新打开应用程序后填充,所以我想我得到了正确的数据。 @shine_joseph,请在从数据库获取数据之前和获取数据库之后记录arraylist的大小,它将帮助您检查天气是否正在获取更新的数据

以上是关于添加数据库后填充listview的主要内容,如果未能解决你的问题,请参考以下文章

Android - 添加到 SQLite 数据库后不会更新 ListView,除非重新启动应用程序

如何在已填充列表的 listView 中添加列表?

如何将数据库里的数据添加到listview中

如何在 Flutter 中添加 ListView.builder 的填充顶部?

使用ListView数据填充多个TextBox

为啥添加listView显示数据后app会崩溃