将数据库中的图像提取到Android GridView中

时间:2016-12-31 06:44:13

标签: android database gridview

我正在尝试从数据库中获取文本和图像链接,并将其添加到ArrayList,然后使用它在网格视图中显示文本和图像。但它没有显示出来。当我尝试添加它时,似乎列表项似乎为空。

我错过了什么?我已经完成了一些答案,但无法弄明白。

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附加到的片段。

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

2 个答案:

答案 0 :(得分:0)

您正在从适配器调用getData(),因此当您初始化它时,您的列表可能为空。

尝试从您的活动或片段调用该方法,然后传递您在适配器类中收到的接收数据。

当你向上或向下滚动时多次调用

getView(),所以永远不要在该方法中调用任何api

提供使用此适配器的代码。

答案 1 :(得分:0)

问题是你没有从数据库中获取值。

您必须先从数据库中获取值。通过使用Volley或类似插件(或Aysnc任务。我认为排球会更好。)