2016-07-15 4 views
0

Итак, я пытаюсь изменить внешний вид элемента списка из моего пользовательского адаптера, который я сделал «на лету». Я бы хотел, чтобы он менялся, когда я нажимаю кнопку из элемента списка моего пользовательского адаптера. This is an example of a Custom List Item looks like. Когда я нажимаю на кнопку, я хочу, чтобы она выполнила действие для изменения макета. Например, после нажатия кнопки «Я», я хочу, чтобы она спрятала другую кнопку или изменила текст кнопки. По некоторым причинам эти команды, похоже, не действуют при нажатии на них.Обновление содержимого пользовательского адаптера на внутренней кнопке Нажмите

Моя конечная цель - изменить размер элемента списка нажатием кнопки. Но, как я уже упоминал, ничто не вступает в силу. Настройка видимости вне метода onClick, похоже, работает, но делать это внутри нет. Я знаю, что код достигнут, но я считаю, что это связано с тем, что адаптер не обновляется, но у меня есть метод notifyDataSetChanged. Любая помощь приветствуется. Благодарю.

Вот мой код пользовательского адаптера

class CustomAdapter extends ArrayAdapter<Player> { 
Button button, button2; 

public CustomAdapter(Context context, ArrayList<Player> players) { 
    super(context, R.layout.player_expanded, players); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater infater = LayoutInflater.from(getContext()); 
    final View customView = infater.inflate(R.layout.custom_list_item, parent, false); 

    button = (Button) customView.findViewById(R.id.button); 
    button2 = (Button) customView.findViewById(R.id.button2); 
    button2.setVisibility(View.VISIBLE); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      button2.setVisibility(View.GONE); //Doesn't take effect 
      notifyDataSetChanged(); 
     } 
    }); 

    return customView; 
    } 
} 

И мой Custom_List_Item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="New Text" 
    android:id="@+id/textView3" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="New Button" 
    android:layout_alignParentTop="true" 
    android:focusable="false" 
    android:id="@+id/button" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="New Button" 
    android:focusable="false" 
    android:id="@+id/button2" /> 
</LinearLayout> 
+0

какая у вас кнопка? –

+0

Извините, просто опечатка. Исправлена. – CrossStitch

+0

android: focusable = "false" удалить и попробовать – comeback4you

ответ

0

Попробуйте, как показано ниже:

class CustomAdapter extends ArrayAdapter<Player> { 

private static class ViewHolder { 
    Button button, button2; 
} 

public CustomAdapter(Context context, ArrayList<Player> players) { 
super(context, R.layout.player_expanded, players); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
ViewHolder viewHolder; // view lookup cache stored in tag 
    if (convertView == null) { 
     viewHolder = new ViewHolder(); 
     LayoutInflater infater = LayoutInflater.from(getContext()); 
final View customView = infater.inflate(R.layout.custom_list_item, parent, false); 

viewHolder.button = (Button) customView.findViewById(R.id.button); 
viewHolder.button2 = (Button) customView.findViewById(R.id.button2); 

viewHolder.button.setTag(position); 
viewHolder.button2.setTag(position); 
convertView.setTag(viewHolder); 
} else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
} 
viewHolder.button2.setVisibility(View.VISIBLE); 
viewHolder.button.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     viewHolder.button2.setVisibility(View.GONE); //Doesn't take effect 
     notifyItemChanged(Integer.valueOf(v.getTag().toString())); 
    } 
}); 

return customView; 
} 
} 
+0

Более или менее это сработало. Это был подход, который мне нужно было взять (используя viewHolder). Большое спасибо! – CrossStitch

+0

:) счастливое кодирование .. – Drv

0

Вызов notifyDataSetChanged() вызывает ListView восстановить все. Он удалит его setVisibility go, вызовите getView() для всех видимых элементов. Для этого вам нужна одна логика и управление видимостью кнопки.

0

Это происходит потому, что вы делаете кнопку невидимой внутри onClick, а затем уведомляете адаптер.

Теперь вы написали button2.setVisibility(View.VISIBLE); внутри вашего адаптера. поэтому всякий раз, когда ваш адаптер получает уведомление, он снова устанавливает видимость кнопки на видимую.

Простой способ использования SparseBooleanArray.

class CustomAdapter extends ArrayAdapter<Player> { 

    Button button, button2; 
    SparseBooleanArray mArray; 

    public CustomAdapter(Context context, ArrayList<Player> players) { 
     super(context, R.layout.player_expanded, players); 
     mArray = new SparseBooleanArray(lenth of your list); 
    } 

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

     if (convertView == null) { 
      LayoutInflater infater = LayoutInflater.from(getContext()); 
      final View customView = infater.inflate(R.layout.custom_list_item, parent, false); 

      button = (Button) customView.findViewById(R.id.button); 
      button2 = (Button) customView.findViewById(R.id.button2); 
     } 
     if(mArray.get(position)){ 
      button2.setVisibility(View.GONE); 
     }else if(!mArray.get(position)){ 
      button2.setVisibility(View.VISIBLE); 
     } 

     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mArray.put(position, true); 
       notifyDataSetChanged(); 
      } 
     }); 

     return customView; 
    } 
} 

Надеюсь, это сработает для вас.