2017-01-19 3 views
0

Я хочу установить поля моей строки RecyclerView без использования xml, потому что иногда у меня есть две строки, и мне нужно динамически менять поля. Но когда я запускаю программу, маржа не устанавливается. Есть ли у кого-то ответ, что я сделал неправильно?Установить поля в адаптере RecyclerView без xml

Мой файл XML для понимания:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 
    android:layout_height="match_parent" 
 
    android:layout_width="match_parent" 
 
    android:focusable="true" 
 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
 
    android:paddingRight="@dimen/activity_horizontal_margin" 
 
    android:clickable="true" 
 
    android:background="?android:attr/selectableItemBackground" 
 
    android:orientation="vertical"> 
 

 
    <TextView 
 
     android:id="@+id/settingTitle" 
 
     android:textColor="@color/colorBlack" 
 
     android:layout_width="match_parent" 
 
     android:textSize="16dp" 
 
     android:layout_height="wrap_content" /> 
 

 
    <TextView 
 
     android:id="@+id/settingSubtitle" 
 
     android:layout_below="@id/settingTitle" 
 
     android:layout_width="match_parent" 
 
     android:layout_height="wrap_content" /> 
 

 
</RelativeLayout>

Это мой onBind от моего адаптера:

@Override 
 
    public void onBindViewHolder(MySettingHolder holder, int position) { 
 
     // Setting for one entry 
 
     Settings setting = settingList.get(position); 
 
     RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
 

 

 
     // If the settingSubtitle is empty it should be not visible and just the settingTitle 
 
     if (setting.getSettingSubtitle().equals("")) { 
 
      params.setMargins(0, 18, 0, 18); 
 
      holder.settingTitle.setLayoutParams(params); 
 
      holder.settingTitle.setText(setting.getSettingTitle()); 
 
      holder.settingSubtitle.setVisibility(View.GONE); 
 
     } else { 
 
      // Set Margins for settingTitle 
 
      params.setMargins(0, 18, 0, 18); 
 
      holder.settingTitle.setLayoutParams(params); 
 
      // Set Margins for settingSubtitle 
 
      params.setMargins(0, 0, 0, 18); 
 
      holder.settingSubtitle.setLayoutParams(params); 
 
      holder.settingTitle.setText(setting.getSettingTitle()); 
 
      holder.settingSubtitle.setText(setting.getSettingSubtitle()); 
 
     } 
 
    }

+1

вы должны установить параметры для вашего recyclerview –

+0

@santoshkumar И что вы думаете, что я здесь делаю? – ItsOdi1

+1

recyclerview.setParams (params); –

ответ

0

РЕШЕНИЕ

Я пробовал много дней получать моя проблема исправлена. Другие ответы были не очень полезными. Мой вопрос был, как я могу установить поле без XML моего TextView в RecyclerView подряде (Потому что иногда у меня есть только один TextView вместо двух):

enter image description here

Это как определить запас нового в адаптер Android в моей ситуации:

// Create new LayoutParams object 
 
     RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
 

 
// Define values in dp and calculate pixels from it because margins are with pixels 
 
int dpValueBottom = 14; 
 
int dpValueLeft = 40; 
 
float d = customContext.getResources().getDisplayMetrics().density; 
 
int marginStandard = (int)(dpValueBottom * d); 
 
int marginLeft = (int)(dpValueLeft * d); 
 

 
holder.settingImage.setImageResource(setting.getSettingImageUrl()); 
 
// If the settingSubtitle is empty it should be not visible and just the settingTitle 
 
if (setting.getSettingSubtitle().equals("")) { 
 
    holder.settingTitle.setText(setting.getSettingTitle()); 
 
    holder.settingSubtitle.setVisibility(View.GONE); 
 

 
    // Get settingTitle TextView 
 
    TextView settingTitle = holder.settingTitle; 
 

 
    // Set margin to params 
 
    params.setMargins(marginLeft, marginStandard, 0, marginStandard); 
 

 
    // Set params to settingTitle 
 
    settingTitle.setLayoutParams(params); 
 

 
} else { 
 
    holder.settingTitle.setText(setting.getSettingTitle()); 
 
    holder.settingSubtitle.setText(setting.getSettingSubtitle()); 
 
}

Я надеюсь, что смогу помочь кому-то с этим ответом.

0

Если я understa и ваша проблема правильно, вы хотите, чтобы это повлияло на весь RecyclerView, а не на каждую строку? Ниже приведено решение.

При инициализации RecyclerView в вашем Activity/Fragment, прежде чем идти в ваш адаптер вы должны установить границы там, если вы хотите, чтобы повлиять на всю вашу RecyclerView, onBindViewHolder связывает макет вы предоставили для каждой строки и манипулирует эти виджеты там, строка за строкой, поэтому поля будут влиять на каждую строку, а не на ваш RecyclerView.

Пример кода внутри вашей деятельности/Фрагмент будет:

recyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
recyclerView.setHasFixedSize(true); 
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false); 
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
params.setMargins(0, 18, 0, 18); 
recyclerView.setLayoutParams(params); 
+0

Нет. Я хочу произвести каждую строку. Иногда у меня есть строка с двумя заголовками, а иногда и с одним. Поэтому каждая строка нуждается в его собственном поле в зависимости от текстовых просмотров, которые находятся в строке. Посмотрите на мое заявление if. Там вы можете понять, что я имею в виду. – ItsOdi1

+0

Без проблем приятель. Я отредактирую свой ответ, когда вернусь на ноутбук. –

+0

Awesome большое спасибо: 0 – ItsOdi1