2015-04-03 3 views
2

Я использую RecyclerView Android для создания линии чата с левым/правым полем сообщений. Я хочу установить гравитацию на элемент RecyclerView. Обычно я бросал itemView в LinearLayout, а затем устанавливал для него силу тяжести ParamLayout. Но если RecyclerView, кажется, не правильно бросать в LinearLayout. Он вернет RecyclerView.LayoutParams. Из-за:Установите гравитацию программно для элемента в RecycerView Android

Подкласс подкласса LayoutParams для детей RecyclerView. Пользовательский макет менеджерам рекомендуется создавать свой собственный подкласс этого класса LayoutParams для хранения любого дополнительного требуемого для каждого ребенка представления метаданных о макете.

И я не могу найти способ установить гравитацию с помощью RecyclerView.LayoutParams: | В любом случае, может ли кто-нибудь найти способ гравитации в RecyclerView? Pls предлагает мне.

----------- ОТЧЕТ О РЕШЕНИИ ------------------
// 1. Дети RecyclerView

 <LinearLayout 
android:id="@+id/id_grandparent" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:background="@android:color/transparent" 
android:divider="@android:color/transparent" 
android:gravity="left" 
android:orientation="vertical"> 
<LinearLayout 
    android:id="@+id/id_llparent" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@drawable/bg_customer_feedback_left" 
    android:gravity="left" 
    android:orientation="vertical"> 
</LinearLayout> 

// 2. OnBindView()

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
     params = setLayoutParamsForParent(params, item.isPosition()); 
     holder.llParentLayout.setLayoutParams(params); //corresponding to id_llparent ID 

// 3.

 private LinearLayout.LayoutParams setLayoutParamsForParent(LinearLayout.LayoutParams params, boolean position) { 
     params.gravity = position ? Gravity.RIGHT : Gravity.LEFT; 
     return params; 
    } 
+0

Проблема решена. –

ответ

-1

Я сделал это, установив гравитацию на вид внутри макета элемента.

LinearLayout.LayoutParams paramsMsg = new LinearLayout. 
      LayoutParams(android.view.ViewGroup.LayoutParams.WRAP_CONTENT, 
      android.view.ViewGroup.LayoutParams.WRAP_CONTENT); 
    if (position%2 == 0){ 
     holder.bodyView.setBackgroundResource(R.drawable.outgoing_messages); 
     paramsMsg.gravity = Gravity.END; 
    } else { 
     holder.bodyView.setBackgroundResource(R.drawable.incoming_messages); 
     holder.bodyView.setTextColor(0xf08888); 
     paramsMsg.gravity = Gravity.START; 
    } 
    holder.bodyView.setLayoutParams(paramsMsg); 

bodyView - это TextView внутри макета объекта, а ширина элемента - «match_parent».

6

Проблема решена. Просто я с помощью

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 

вместо

RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) holder.llGrandParent.getLayoutParams(); 

А затем установить гравитацию для LinearLayout Params нормально.

+0

Можете ли вы показать эту часть своего кода? Поскольку я попытался использовать LinearLayout и RelativeLayout в качестве дочернего элемента RecyclerView, и ваш код не работает для меня. Или, может быть, вы можете ответить на мой вопрос? Я действительно застрял здесь: http://stackoverflow.com/questions/31101577/is-it-possible-to-set-gravity-programmatically-for-recyclerview-children-in-andr/31106462#31106462 – Loolooii

+0

Спасибо Pham, Я попробую и дам вам знать, будет ли это работать для меня. – Loolooii

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