2014-12-12 1 views
1

Я начинаю программировать на андроид, и это мой первый вопрос в StackOverflow. У меня есть фрагмент предпочтения в и щелчок предпочтения, я пытаюсь отобразить вид сетки внутри диалогового. Вид сетки динамически загружается. Я пробовал много способов сделать это, но никто не работал для меня.Отображение сетки внутри диалога из фрагмента

Это мой код в MyPreferenceFragment, что расширяет PreferenceFragment

Preference iconPref = (Preference)findPreference("pref_icon"); 
iconPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {  
    @Override 
    public boolean onPreferenceClick(Preference arg0) { 
     Log.i(TAG, "Preparing grid view layout"); 
     GridView gridview = (GridView)getActivity().findViewById(R.id.icons_gridview); 
     gridview.setAdapter(new ImageAdapter(getActivity())); 
     Log.i(TAG, "Icons image adapter ready"); 

     gridview.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 
       Toast.makeText(getActivity(), "" + position, Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     Log.i(TAG, "Creating dialog"); 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setView(gridview); 
     builder.show(); 
     return false; 
    } 
}); 

Это мой ImageAdapter.java код

public class ImageAdapter extends BaseAdapter { 
    private Context mContext; 

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

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

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

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

    // create a new ImageView for each item referenced by the Adapter 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     ImageView imageView; 
     if (convertView == null) { 
      imageView = new ImageView(mContext); 
      imageView.setLayoutParams(new GridView.LayoutParams(85, 85)); 
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
      imageView.setPadding(8, 8, 8, 8); 
     } 
     else 
     { 
      imageView = (ImageView) convertView; 
     } 

     imageView.setImageResource(mThumbIds[position]); 
     return imageView; 
    } 

    // references to our images 
    private Integer[] mThumbIds = { 
     R.drawable.ic_img1, R.drawable.ic_img2, 
     R.drawable.ic_img3, R.drawable.ic_img4, 
     R.drawable.ic_img5, R.drawable.ic_img6, 
     R.drawable.ic_img7 
    }; 
} 

И, наконец, это мой файл макета Xml: icon_grid.xml

<?xml version="1.0" encoding="utf-8"?> 
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/icons_gridview" 
    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" 
/> 

Я с нетерпением жду любых Помощь или альтернативный вариант. И спасибо заранее ...

ответ

0

Шаг 1: Используйте изображение, чтобы посмотреть изображение внутри макета.

image_item.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     > 

    <ImageView 
      android:id="@+id/icon_item" 
      android:layout_width="75dp" 
      android:layout_height="75dp" 
      android:padding="5dp" 
      android:layout_centerInParent="true" 
      android:contentDescription="@string/desc_list_item_icon" 
      android:src="@drawable/ic_img_default" 
      /> 
</RelativeLayout> 

Шаг 2: Создать класс для хранения информации об элементах, которые будут ставить в виде сетки. Я поместил только изображение для предмета.

GridViewItem.java

public class GridViewItem { 
    public final int icon;  // the drawable id for the ListView item ImageView 

    public GridViewItem(int icon) { 
     this.icon = icon; 
    } 
    public int getIcon(){ 
     return this.icon; 
    } 
} 

Шаг 3: Нам нужен класс адаптера для установки адаптера.

ImageAdapter.java

public class ImageAdapter extends BaseAdapter 
{ 
    private Context context; 
    private ArrayList<GridViewItem> gridViewItems; 

    public ImageAdapter(Context context, ArrayList<GridViewItem> gridViewItems) 
    { 
     this.context = context; 
     this.gridViewItems = gridViewItems; 
    } 

    @Override 
    public int getCount() 
    { 
     return gridViewItems.size(); 
    } 

    @Override 
    public Object getItem(int position) 
    {  
     return gridViewItems.get(position); 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     if (convertView == null) 
     { 
      LayoutInflater mInflater = (LayoutInflater) 
        context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
      convertView = mInflater.inflate(R.layout.image_item, null); 
     } 

     ImageView imgIcon = (ImageView) convertView.findViewById(R.id.icon_item); 
     imgIcon.setImageResource(gridViewItems.get(position).getIcon()); 

     return convertView; 
    } 
} 

Шаг 4: Наконец, нам нужно создать и заполнить вид сетки и установить его в диалоговом окне.

В фрагменте

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
GridView gridView = new GridView(getActivity()); 

ArrayList<GridViewItem> mList = new ArrayList<GridViewItem>(); 

mList.add(new GridViewItem(R.drawable.ic_img1)); 
mList.add(new GridViewItem(R.drawable.ic_img2)); 
: 
mList.add(new GridViewItem(R.drawable.ic_img9)); 
mList.add(new GridViewItem(R.drawable.ic_img10)); 

ImageAdapter iconItems = new ImageAdapter(getActivity(), mList); 

gridView.setAdapter(iconItems); 
gridView.setNumColumns(4);    // Number of columns 
gridView.setChoiceMode(GridView.CHOICE_MODE_SINGLE);  // Choice mode 
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     // do something here 
     Toast.makeText(getActivity(), "Position: " + position, Toast.LENGTH_SHORT).show(); 
     iconDialog.dismiss(); // Dismiss dialog after click on item 
    } 
}); 
builder.setView(gridView); 
builder.setTitle("Select an icon"); 
iconDialog = builder.create(); 
iconDialog.show();