将图像从数据库提取到Android GridView
我试图从数据库中获取文本和图像链接,并将其添加到ArrayList中,然后使用它在网格视图中显示文本和图像。但它没有出现。当我尝试添加列表项时,列表项似乎为空 我错过了什么?我已经找到了一些答案,但没能找到答案将图像从数据库提取到Android GridView,android,database,gridview,Android,Database,Gridview,我试图从数据库中获取文本和图像链接,并将其添加到ArrayList中,然后使用它在网格视图中显示文本和图像。但它没有出现。当我尝试添加列表项时,列表项似乎为空 我错过了什么?我已经找到了一些答案,但没能找到答案 public final class GridAdapter extends BaseAdapter { public static final String showUrl = "http://netbigs.com/apps/fetch.php"; String myJSON; p
public final class GridAdapter extends BaseAdapter {
public static final String showUrl = "http://netbigs.com/apps/fetch.php";
String myJSON;
public String mvname;
String mvinfo;
public String rdate,imglink;
private Context mContext;
private final List<Item> mItems = new ArrayList<Item>();
private final LayoutInflater mInflater;
private static final String TAG_RESULTS = "result";
private static final String TAG_ID = "mvid";
private static final String TAG_NAME = "mvname";
private static final String TAG_IMG = "imglink";
private static final String TAG_DATE = "rdate";
private static final String TAG_MOVINF = "mvinfo";
JSONArray movies = null;
public GridAdapter(Context context) {
mItems.add(new Item(mvname,imglink));
mContext=context;
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return mItems.size();
}
@Override
public Item getItem(int i) {
return mItems.get(i);
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
View v = view;
ImageView picture;
TextView name;
getData();
if (v == null) {
v = mInflater.inflate(R.layout.grid_item, viewGroup, false);
v.setTag(R.id.picture, v.findViewById(R.id.picture));
v.setTag(R.id.text, v.findViewById(R.id.text));
}
picture = (ImageView) v.getTag(R.id.picture);
name = (TextView) v.getTag(R.id.text);
Item item = getItem(i);
Picasso.with(this.mContext).load(item.drawableId).into(picture);
name.setText(item.name);
System.out.println(item.name);
return v;
}
private static class Item {
public final String name;
public final String drawableId;
Item(String name, String drawableId) {
this.name = name;
this.drawableId = drawableId;
}
}
protected void showList(){
try{
JSONObject jsonObj = new JSONObject(myJSON);
movies = jsonObj.getJSONArray(TAG_RESULTS);
for (int i=0;i<movies.length();i++){
JSONObject c = movies.getJSONObject(i);
String mvid = c.getString(TAG_ID);
mvname = c.getString(TAG_NAME);
System.out.println(mvname);
imglink = c.getString(TAG_IMG);
System.out.println(imglink);
rdate = c.getString(TAG_DATE);
mvinfo = c.getString(TAG_MOVINF);
try {
}
catch (Exception e){
e.printStackTrace();
}
}
}
catch (JSONException e){
e.printStackTrace();
}
}
public void getData(){
class GetDataJSON extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
try {
String uri = showUrl;
URL url = new URL(uri);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
InputStream inputStream = null;
String result = null;
inputStream = con.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
return sb.toString();
} catch (Exception e) {
return null;
}
}
@Override
protected void onPostExecute(String result){
myJSON=result;
showList();
}
}
GetDataJSON g = new GetDataJSON();
g.execute();
}
}
公共最终类GridAdapter扩展BaseAdapter{
公共静态最终字符串showUrl=”http://netbigs.com/apps/fetch.php";
字符串myJSON;
公共字符串名称;
字符串mvinfo;
公共字符串rdate,imglink;
私有上下文;
private final List mItems=new ArrayList();
私人最终布局平面图;
私有静态最终字符串标记_RESULTS=“result”;
私有静态最终字符串标记\u ID=“mvid”;
私有静态最终字符串标记_NAME=“mvname”;
私有静态最终字符串标记\u IMG=“imglink”;
私有静态最终字符串标记_DATE=“rdate”;
私有静态最终字符串标记_MOVINF=“mvinfo”;
JSONArray电影=null;
公共GridAdapter(上下文){
添加(新项目(mvname,imglink));
mContext=上下文;
mInflater=LayoutInflater.from(上下文);
}
@凌驾
public int getCount(){
返回mItems.size();
}
@凌驾
公共项getItem(int i){
返回mItems.get(i);
}
@凌驾
公共长getItemId(int i){
返回0;
}
@凌驾
公共视图getView(int i、视图视图、视图组视图组){
视图v=视图;
图像视图图片;
文本视图名称;
getData();
如果(v==null){
v=最小平坦度。充气(R.layout.grid_项,视图组,false);
v、 setTag(R.id.picture,v.findViewById(R.id.picture));
v、 setTag(R.id.text,v.findviewbyd(R.id.text));
}
picture=(ImageView)v.getTag(R.id.picture);
name=(TextView)v.getTag(R.id.text);
项目=获取项目(i);
毕加索.with(this.mContext).load(item.drawableId).into(图片);
name.setText(item.name);
系统输出打印项次(项目名称);
返回v;
}
私有静态类项{
公共最终字符串名;
公共最终字符串drawableId;
项(字符串名称、字符串drawableId){
this.name=名称;
this.drawableId=drawableId;
}
}
受保护的无效显示列表(){
试一试{
JSONObject jsonObj=新的JSONObject(myJSON);
movies=jsonObj.getJSONArray(标记结果);
对于(int i=0;i您正在从适配器调用getData()
,因此,当您当时初始化它时,您的列表可能为空
尝试从活动或片段中调用该方法,然后在适配器类中传递接收到的数据
当您向上或向下滚动时,getView()
会被多次调用,因此永远不要在该方法中调用任何api
提供使用此适配器的代码。您正在从适配器调用getData()
,因此在初始化时,列表可能为空
尝试从活动或片段中调用该方法,然后在适配器类中传递接收到的数据
当您向上或向下滚动时,getView()
会被多次调用,因此永远不要在该方法中调用任何api
提供使用此适配器的代码。问题是您没有从数据库中获取值
您必须首先从数据库获取值。通过使用Volley或类似的插件(或者Aysnc task.Volley,我认为会更好。)问题是您没有从数据库获取值
您必须首先从数据库中获取值。通过使用Volley或类似的插件(或者Aysnc task.Volley,我认为会更好。)您应该在showList()方法的for循环的list中添加数据您应该在showList()方法的for循环的list中添加数据我已经添加了使用适配器的片段代码。您必须将getData()放入和showList()然后,在收到响应后,您必须在适配器构造函数中创建一个记录和pas列表,该列表将起作用。谢谢,这修复了它。我应该在哪里调用api?您可以在片段类中的任何位置调用它,但请注意,要么在收到数据后初始化适配器并设置为gridview,要么不能tifyDatasetChanged()在收到数据后,我添加了使用适配器的片段代码。您必须将getData()和showList()放入然后,在收到响应后,您必须在适配器构造函数中创建一个记录和pas列表,该列表将起作用。谢谢,这修复了它。我应该在哪里调用api?您可以在片段类中的任何位置调用它,但请注意,要么在收到数据后初始化适配器并设置为gridview,要么不能tifyDatasetChanged()接收数据后,正确获取了值,但我无法确定应将getdata()放置在何处。正确获取了值,但无法确定应将getdata()放置在何处。
public class MovieFragment extends Fragment {
public MovieFragment() {
// Required empty public constructor
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_movie, container, false);
GridView gridView = (GridView)view.findViewById(R.id.gridview);
gridView.setAdapter(new GridAdapter(getActivity()));
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent i;
switch (position){
case 0:
i = new Intent(MovieFragment.this.getActivity(),MovieDetail.class);
startActivity(i);
break;
case 1:
i = new Intent(MovieFragment.this.getActivity(),MovieDetail.class);
startActivity(i);
break;
case 2:
i = new Intent(MovieFragment.this.getActivity(),MovieDetail.class);
startActivity(i);
break;
case 3:
i = new Intent(MovieFragment.this.getActivity(),MovieDetail.class);
startActivity(i);
break;
}
}
});
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public void onDetach() {
super.onDetach();
}
}