2015-08-18 3 views
2

Я начал изучать развитие Android. Я делаю приложение, в котором я хочу показать миниатюры фильма (просмотр изображения и текстовое представление), объединенные в макетном представлении сетки, я сделал пользовательский адаптер, но проблема в том, что я не могу понять, как показать изображение и просмотр текста вместе. Я запускаю приложение, оно показывает пустой белый экран. Я пробовал много решений, а также искал много, но я не могу понять, как это сделать, пожалуйста, помогите мне. Вот мой код.Android Grid View с пользовательским базовым адаптером

public class ImageAdapter extends BaseAdapter { 

    private Context mContext; 
    private LayoutInflater inflater; 
    public ImageAdapter(Context c) { 

     mContext = c; 
     // 
    } 

    @Override 
    public int getCount() { 
     return mThumbIds.length; 
    } 

    @Override 
    public Object getItem(int i) { 
     return null; 
    } 

    @Override 
    public long getItemId(int i) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup viewGroup) { 


     NewHolder holder = null; 
     ImageView imageView; 

     inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 



     if(convertView==null){ 
      holder = new NewHolder(); 

      convertView =inflater.inflate(R.layout.activity_main,viewGroup,false); 


      holder.imageView = new ImageView(mContext); 
      holder.textView = new TextView(mContext); 

      holder.imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
      holder.imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 



     // holder.textView.setLayoutParams(new GridView.LayoutParams(85, 85)); 

      convertView.setTag(holder); 
      //textView. 
      // textView.setText("Hello"); 
      holder.imageView.setPadding(8, 8, 8, 8); 

     } 


     else { 
      holder = (NewHolder) convertView.getTag(); 
      //imageView= (ImageView) convertView. ; 
      //textView = (TextView) convertView; 
     } 


//  convertView. 
     holder.imageView.setImageResource(mThumbIds[position]); 
    // holder.textView.setText("hello"); 
     return convertView; 



    } 



    private Integer[] mThumbIds = { 
      R.drawable.sample_2, R.drawable.sample_3, 
      R.drawable.sample_4, R.drawable.sample_5, 
      R.drawable.sample_6, R.drawable.sample_7, 
      R.drawable.sample_0, R.drawable.sample_1, 
      R.drawable.sample_2, R.drawable.sample_3, 
      R.drawable.sample_4, R.drawable.sample_5, 
      R.drawable.sample_6, R.drawable.sample_7, 
      R.drawable.sample_0, R.drawable.sample_1, 
      R.drawable.sample_2, R.drawable.sample_3, 
      R.drawable.sample_4, R.drawable.sample_5, 
      R.drawable.sample_6, R.drawable.sample_7 
    }; 

} 

Основная деятельность

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     GridView gridview = (GridView) findViewById(R.id.grid_view); 
     gridview.setAdapter(new ImageAdapter(this)); 
    // setContentView(gridview); 

    } 

держатель класса

public class NewHolder { 

     public ImageView imageView; 
     public TextView textView; 
    } 

Главная Xml Layout File

<?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="match_parent" 
    android:layout_height="match_parent" 
    android:columnWidth="90dp" 
    android:numColumns="auto_fit" 
    android:verticalSpacing="10dp" 
    android:horizontalSpacing="10dp" 
    android:stretchMode="columnWidth" 
    android:gravity="center" 
    /> 

ответ

1

Вот решение вашей проблемы. Неправильно используется адаптер. Вы надуваете «GridView» адаптером в этой строке.

convertView =inflater.inflate(R.layout.activity_main,viewGroup,false); 

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

<LinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 
<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/movieimage" 
    android:src="@drawable/moviethumb"/> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/movie_title" 
    android:id="@+id/todo_list_item_bottom_text" 
    android:layout_marginTop="10dp" 
    android:textSize="12sp"/> 
</LinearLayout> 

Это руководство должно помочь вам. Это для просмотра списка, но все адаптеры в Android очень похожи. Adapter Tutorial

Я заметил что-то, что вы можете улучшить. Поместите свой inflator внутри вас convertview == null. Нет смысла создавать этот объект, когда он не используется.

0

сделать свой собственный макет элемента сетки.

макет/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/gridItemIV" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 

    <TextView 
     android:id="@+id/gridItemTextTV" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Medium Text" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 
</LinearLayout> 

Изменение:

if(convertView==null){ 
     holder = new NewHolder(); 
     convertView =inflater.inflate(R.layout.grid_item,viewGroup,false); 

      holder.imageView = (ImageView)convertView.findViewById(R.id.gridItemIV) 
      holder.textView = (TextView)convertView.findViewById(R.id.gridItemTextTV) 
    }else { 
... 
+0

ThankYou так много sir..it работал – user2991828

0

Вы не должны надувать основной вид деятельности в своем адаптере. Вместо этого вы должны иметь макет отдельной строки для раздувания в вашем методе getView().

Что вам нужно сделать, вы должны предоставить адаптеру список данных, которые вы хотите установить в gridview. Адаптер накачивает строки (отдельный элемент в сетке) в соответствии с количеством данных (моделей), то вам придется назначать данные отдельным элементам строки.

Итак, я скорректировал адаптер. Надеюсь, что это будет полезно:

public class ImageAdapter extends BaseAdapter { 

    private Context mContext; 
    private LayoutInflater inflater; 



    private Integer[] mThumbIds = { 
      R.drawable.sample_2, R.drawable.sample_3, 
      R.drawable.sample_4, R.drawable.sample_5, 
      R.drawable.sample_6, R.drawable.sample_7, 
      R.drawable.sample_0, R.drawable.sample_1, 
      R.drawable.sample_2, R.drawable.sample_3, 
      R.drawable.sample_4, R.drawable.sample_5, 
      R.drawable.sample_6, R.drawable.sample_7, 
      R.drawable.sample_0, R.drawable.sample_1, 
      R.drawable.sample_2, R.drawable.sample_3, 
      R.drawable.sample_4, R.drawable.sample_5, 
      R.drawable.sample_6, R.drawable.sample_7 
    }; 

    private String mTexts[]={"a","b","d",....,"your texts"}; 

    public ImageAdapter(Context c) { 
     mContext = c; 
    } 

    @Override 
    public int getCount() { 
     return mThumbIds.length; // adapter inflates the row according to the count of data given 
    } 

    @Override 
    public Object getItem(int i) { 
     return null; 
    } 

    @Override 
    public long getItemId(int i) { 
     return mThumbIds.length;// inflates rows according to data given 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup viewGroup) { 


     NewHolder holder = null; 
     ImageView imageView; 

     if(convertView==null){//if convert view is null then only inflate the row 
      inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.grid_item_layout,viewGroup,false); 

      holder = new NewHolder(); 

      //find views in item row 
      holder.imageView = (ImageView)convertView.findViewById(R.id.imageview_id); 
      holder.textView = (ImageView)convertView.findViewById(R.id.textview_id); 

      convertView.setTag(holder); 
     } 
     else { //otherwise get holder from tag 
      holder = (NewHolder) convertView.getTag(); 
     } 

     //set data here 
     holder.imageView.setImageResource(mThumbIds[position]); 
     holder.textView.setText(mTexts[position]); 

     return convertView; 
    } 

    public class NewHolder { 
     public ImageView imageView; 
     public TextView textView; 
    } 

} 

и ваш grid_item.xml должны иметь макет для каждого элемента GridView как:

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

<ImageView 
     android:id="@+id/textview_id" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 

<TextView android:id="@+id/imageview_id" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 
+0

о да он работал. ... Большое уважение ко всем вам. – user2991828

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