2016-12-31 35 views
1

我試圖從數據庫中提取文本和圖像鏈接,並將其添加到ArrayList中,然後用它在網格視圖中顯示文本和圖像。但它沒有出現。當我嘗試添加它時,似乎列表項似乎爲空。從數據庫中提取圖像到Android GridView

我錯過了什麼?我已經經歷了一些答案,無法弄清楚。

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

你應該在列表中添加數據在showList()方法的循環中 –

回答

0

您從適配器調用getData()因此它可能可能是當你在那個時候初始化列表爲空。

嘗試從您的活動或片段中調用該方法,然後傳遞您在適配器類中收到的接收數據。當你向上或向下滾動所以從不調用該方法

任何API提供你在哪裏使用這個適配器的代碼

getView()被稱爲多的時間。

+0

我已經添加了適配器的片段代碼用過的。 –

+0

你必須把getData()和showList(),然後在收到響應後,你必須創建一個記錄列表,並在你的適配器構造函數中通過這個列表,它將起作用。 –

+0

謝謝,這解決了它。我應該在哪裏調用API? –

0

問題是您沒有從數據庫中獲取值。

您必須首先從數據庫中獲取值。通過使用Volley或一些像這樣的插件(或Aysnc任務。抽球會更好,我認爲)。

+0

值正確提取,但我無法弄清楚我應該在哪裏放置getdata()。 –

相關問題