2013-04-06 2 views
-2

В настоящее время я создаю приложение, в котором я хочу загрузить список данных из базы данных, а затем отобразить эти данные в GridView. Я создал соединение с базой данных и отступил назад и успешно заполнил GridView. Проблема, с которой я сталкиваюсь, заключается в том, что в моем макете строки списка я хочу иметь возможность setLayoutParams, чтобы изображения можно обрезать и все были одного размера, и это не вызовет проблем с другими размерами устройства.Android LazyLoading Gridview Изображения с заголовком?

Файлы У меня есть ниже:

list_row.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="15dp" 
    android:orientation="vertical"> 



    <ImageView 
     android:id="@+id/list_image" 
     android:layout_width="110dp" 
     android:layout_height="110dp" 
     android:src="@drawable/ic_launcher" /> 


</LinearLayout> 

ListAdapter.java

import java.util.ArrayList; 
import java.util.HashMap; 

import android.app.Activity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.GridView; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class DressesAdapter extends BaseAdapter { 

    private Activity activity; 
    private ArrayList<HashMap<String, String>> data; 
    private static LayoutInflater inflater=null; 
    public ImageLoader imageLoader; 

    public DressesAdapter(Activity a, ArrayList<HashMap<String, String>> d) { 
     activity = a; 
     data=d; 
     inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     imageLoader=new ImageLoader(activity.getApplicationContext()); 
    } 

    public int getCount() { 
     return data.size(); 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     View vi=convertView; 
     if(convertView==null) 
      vi = inflater.inflate(R.layout.list_row, null); 

     ImageView thumb_image=(ImageView)vi.findViewById(R.id.list_image); // thumb image 
     //thumb_image.setLayoutParams(new ImageView.LayoutParams(70, 70)); 

     HashMap<String, String> dress = new HashMap<String, String>(); 
     dress = data.get(position); 

     imageLoader.DisplayImage(dress.get(DressListActivity.TAG_IMAGE), thumb_image); 
     return vi; 
    } 
} 

ListActivity.java

<?xml version="1.0" encoding="utf-8"?> 
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/grid_view" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:numColumns="auto_fit" 
    android:columnWidth="90dp" 
    android:horizontalSpacing="5dp" 
    android:verticalSpacing="5dp" 
    android:gravity="center" 
    android:stretchMode="columnWidth" > 

</GridView> 

Я получаю ошибку при запуске это ниже:

04-06 14:02:18.260: E/AndroidRuntime(12798): java.lang.ClassCastException: android.widget.AbsListView$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParams 

Я надеюсь, что кто-то может помочь мне исправить эту проблему, так как его очень раздражает, заранее спасибо :)

ответ

0

Это подход, который я использую, чтобы показать сетку с 3 картинками, которые соответствуют всем устройствам с заголовками TextView для каждого из них.

Он правильно отображает все устройства.

Все мои фотографии - это портрет с соотношением сторон 1,5, например высота 300 px на ширину 200 px. (Это 3,0 и 1,5, которые вы видите в функции калибровки и изменения в потребностях).

Я использую портрет для своих макетов.

Надеюсь, вы можете заставить его работать, его сложно. Это очень хорошо для меня.

настроить GridView и его адаптер, такие как это:

// create grid and adapter 
gridAdapter = new SET UP YOUR ADAPTER HERE; 
    grid = (GridView) findViewById(R.id.grid); 
    grid.setAdapter(YOUR ADAPTER); 
    grid.setFadingEdgeLength(0); 
    int picHeight = Utils.getGridPicHeight(MainActivity.this); 
    int picLength = (int) ((float)picHeight/1.5); 
    grid.setColumnWidth(picLength); 

И Utils.getGridPicHeight:

public static int getGridPicHeight (Activity activity) { 
     DisplayMetrics dMetrics = new DisplayMetrics(); 
     activity.getWindowManager().getDefaultDisplay().getMetrics(dMetrics); 
     // give back a % of the screen width for the height 
     final float WIDE = activity.getResources().getDisplayMetrics().widthPixels; 
     int value = (int)(WIDE/3.0f * 1.5f); 
     return value; 
} 

и очень важно, в вашем адаптере, вы должны установить изображения как это:

 LinearLayout.LayoutParams params; 

     int picHeight = Utils.getGridPicHeight(activity); 
     int picLength = (int) ((float)picHeight/1.5); 
     params = new LinearLayout.LayoutParams(picLength,picHeight); 
     params.gravity=Gravity.CENTER; 
     params.height=picHeight; 
     params.width=picLength; 
     image.setLayoutParams(params); 

grid_item.XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 
    <ImageView 
     android:id="@+id/image" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
    /> 
    <TextView 
     android:id="@+id/imgTit" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:typeface="sans" 
     android:textStyle="normal" 
     android:maxLines="1" 
     android:gravity="center" 
     android:layout_gravity="center"> 
    </TextView> 
</LinearLayout> 

, а затем в вашем GridView Внутри LinearLayout

<LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:layout_marginTop="2dip" 
     android:layout_gravity="center" 
    android:gravity="center"> 
     <GridView 
      android:id="@+id/grid" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:numColumns="3" 
      android:horizontalSpacing="4dp" 
      android:verticalSpacing="4dp" 
      android:stretchMode="spacingWidthUniform"/> 
</LinearLayout> 
+0

Я пытаюсь реализовать код, и я думаю, что я почти там мне просто нужно знать, на адаптере, что установить Params переменная, как в настоящий момент, она говорит, что «параметры не могут быть разрешены переменной»? Нужно ли мне инициализировать его наверху как-то? Спасибо – user723858

+0

Ок, я думаю, что я почти там, мне просто нужно знать, как изменить свое решение, чтобы я мог иметь изображения самостоятельно и отображаться в пределах 1dp друг от друга, любые идеи? – user723858

+0

Для объявления PARAMS, вот как я заявляю: ** bold ** LinearLayout.LayoutParams params; –

0

Exception вызвано просто import неправильный LayoutParams подкласс. Может быть, проще всего написать new LinearLayout.LayoutParams(.

Несвязанный, но также и scaleType из ImageView может пригодиться.

Смежные вопросы