2016-07-15 64 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

你的button是通过了什么? –

+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去掉,为所有可见的项目调用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; 
    } 
} 

希望这会对你有用。

相关问题