2016-10-18 8 views
0

У меня есть RecyclerView, который имеет CardView для отображения элементов. Элементы содержат изображения и TextView , которые будут заполнены после выбора пользователем элемента. Когда они выбирают элемент, я извлекаю выбранный фон элемента и запускаю намерение открыть новое действие, в котором я динамически создаю макет, а устанавливает фон выбранного элемента в качестве фона макета. Это мой класс адаптера, который будет заполнить мой RecyclerView, где я получаю фон выбранного элемента.Recyclerview изображение выбранного элемента слишком велико на устройствах меньшего экрана

public class PersonsAdapter extends RecyclerView.Adapter<PersonsAdapter.MyViewHolder> { 

     private List<Person> mpersonsList; 


     public class MyViewHolder extends RecyclerView.ViewHolder { 
      public TextView name .....; 
      View v; 
      Person p; 

      public MyViewHolder(View view) { 
       super(view); 
       name = (TextView) view.findViewById(R.id.tvName); 
       //and all other textviews.... 

       v = view; 
       v.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         //if (view.getId() == getAdapterPosition()) { 
          //int itemposition = mRecyclerView.indexOfChild(v); 
          Intent i = new Intent(context, SelectedTemplate.class); 
          startActivity(i); 
          theBackground = view.getBackground();//retrieve the background of the selected item 
         //} 
        } 
       }); 
       List<Drawable> templatesList = new ArrayList<>(); 
      } 
     } 


     public PersonsAdapter(List<Person> personsList) { 
      this.mpersonsList = personsList; 
     } 

     @Override 
     public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.person, parent, false); 

      return new MyViewHolder(itemView); 
     } 

     @Override 
     public void onBindViewHolder(MyViewHolder holder, int position) { 
      Person person = mpersonsList.get(position); 
      holder.name.setText(person.getName()); 
      //and other details of the item...... 

      holder.p = mpersonsList.get(position); 

      if(position == 0){ 
       holder.v.setBackgroundResource(R.drawable.wavy_curves_onblack); 
      } 
     //and other background images..... 
     } 

     @Override 
     public int getItemCount() { 
      return mpersonsList.size(); 
     } 
    } 

В следующем действии я извлекаю выбранный элемент следующим образом.

private void getSelectedTemplate() { 
     LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View v = vi.inflate(R.layout.selected_template, null); 

     // fill in any details dynamically here 


     //insert into main view 
     ViewGroup insertPoint = (ViewGroup) findViewById(R.id.selectedtemplatelayout); 
     insertPoint.setBackground(TheTemplates.theBackground); 
     insertPoint.addView(v, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 

     rl = (LinearLayout) findViewById(R.id.selectedtemplatelayout); 
     image.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)); 
     image.getLayoutParams().height = (int) getResources().getDimension(R.dimen.image_height); 
     image.getLayoutParams().width = (int) getResources().getDimension(R.dimen.image_width); 



     name.setText("NAME"); 
     name.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)); 
     //add all other textviews dynamically..... 

     rl.removeAllViews(); 
     rl.addView(image); 
     rl.addView(name); 
     //add all remaining textviews 
    } 

Когда я проверить его в эмуляторе или устройстве, которое меньше, чем 5.5inches я вижу очень большой фон (я могу прокрутить навсегда), и я могу видеть только два изображения, но не в TextViews. В больших устройствах (как реальных, так и эмулятор) я получаю правильный размер фона. Но я не вижу текстовых просмотров, как и более мелкие устройства . Я вижу два изображения.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:focusable="true" 
    android:focusableInTouchMode="true"><!--this two lines will hide the keyboard and make the NAME textview visible --> 
    <android.support.v7.widget.Toolbar 
     android:id="@+id/my_toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/ThemeOverlay.AppCompat.ActionBar" 
     app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> 
    <ScrollView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

    <LinearLayout 
     android:id="@+id/selectedtemplatelayout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:padding="4dp" 
     android:orientation="vertical" > 
//this is the layout I would like to stuff all my textviews and images and //set the background of the selected item. 
    </LinearLayout> 

    </ScrollView> 


//another layout 
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:fillViewport="true"> 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="vertical"> 
     </LinearLayout> 
    </ScrollView> 
</LinearLayout> 

Это RecyclerView

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

    <android.support.v7.widget.RecyclerView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/templateList" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_gravity="center_horizontal" 
     /> 
<!--</LinearLayout>--> 

Я не могу показаться, чтобы выяснить, почему это происходит и как я могу это исправить. Любая помощь приветствуется.

+0

Сохранение практики разработки экранов для множества резолюций –

ответ

0

Я решил проблему размера, просто изменяя высоту макета от wrap_content ограниченного размера, как 300dp или что-то и это, кажется, работает на всех размеров экрана. Но текстовые изображения не видны на всех экранах, которые являются нечетными. Я обновлю этот ответ, когда исправлю это, чтобы кто-то когда-нибудь помог.

+1

использовать 320dp для обычных экранов –

1

Создать папку как

Mobile: Создать другую папку значения которых упоминается ниже:

values      (For mdpi devices) 
values-hdpi    (For hdpi devices) 
values-xhdpi    (For xhdpi devices) 
values-xxhdpi    (For xxhdpi devices) 

таблетки: Создать другую папку макет, который уже ниже:

layout-sw600dp    (For 7? to 9? Screen) 
layout-sw720dp    (For 10? to above screen) 

Для ресурсов изображения: Creat е 4 Drawable папки:

drawable-mdpi 
drawable-hdpi 
drawable-xhdpi 
drawable-xxhdpi 

И если вы обращаетесь через API. использовать различные изображения размера imagesmall_link imagelarge_link imagexlarge_link

+0

Я ценю вашу помощь. Я буду считать, что по мере продолжения разработки приложения. –

+0

Как бы применить их, если у меня есть форма, созданная в xml, которую я использую в качестве фона? –

+0

Я не могу понять ваш вопрос, пожалуйста, можете ли вы быть конкретным? –

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