2016-07-27 21 views
1

は私がListViewコントロールの下にボタンを配置し、ScrollView(リストビューは、要素をたくさん持っている場合は、ボタンが見えないと、ユーザーがそれをクリックし、スクロールダウンしているように、だけでなく、リストビューがあまりにもスクロール可能だボタンでなければなりません)内のすべてのものを持っていると思います。Androidのスクロール可能なレイアウト

私のXMLは次のとおりです。それは次のようになります

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.plan.aplikacjamobilna.fragments.tabs.Allergies"> 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     android:layout_gravity="center_horizontal"> 
      <ListView 
       android:id="@+id/allergies_listView" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:dividerHeight="3dp" 
       android:divider="#cccccc"> 
      </ListView> 
     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Button"/> 
    </LinearLayout> 
</ScrollView> 

enter image description here

私は "match_parent" はlayout_hightとして存在し、それが動作しない理由はわかりません。 私のコードではどのような変更がありますか?

私のアダプタ:

public class AllergiesAdapter extends ArrayAdapter{ 

    List list = new ArrayList(); 
    char[] keys; 

    public AllergiesAdapter(Context context, int resource) { 
     super(context, resource); 
    } 

    public static class DataHandler{ 
     ImageView allergieIcon; 
     ImageView showDetailsIcon; 
     TextView allergieName; 
     FrameLayout detailsLayout; 
     RelativeLayout infoLayout; 
     CheckBox checkBox; 
    } 

    @Override 
    public void add(Object object) { 
     super.add(object); 
     list.add(object); 
    } 

    @Override 
    public int getCount() { 
     return this.list.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return this.list.get(position); 
    } 

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

     View view = convertView; 
     final DataHandler dataHandler; 
     if(convertView==null){ 
      LayoutInflater inflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = inflater.inflate(R.layout.allergie_item,parent,false); 
      dataHandler = new DataHandler(); 
      dataHandler.allergieIcon = (ImageView) view.findViewById(R.id.allerie_icon); 
      dataHandler.showDetailsIcon = (ImageView) view.findViewById(R.id.allergie_show_info); 
      dataHandler.allergieName =(TextView) view.findViewById(R.id.allerie_name); 
      dataHandler.detailsLayout=(FrameLayout)view.findViewById(R.id.allergie_frameLayout); 
      dataHandler.infoLayout=(RelativeLayout)view.findViewById(R.id.info_layout); 
      dataHandler.checkBox=(CheckBox)view.findViewById(R.id.allergie_checkbox); 
      view.setTag(dataHandler); 
     } 
     else{ 
      dataHandler=(DataHandler) view.getTag(); 
     } 
     LayoutInflater inflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     final AllergiesDataProvider allergiesDataProvider; 
     allergiesDataProvider = (AllergiesDataProvider) this.getItem(position); 
     dataHandler.allergieIcon.setImageResource(allergiesDataProvider.getAllergieIcon()); 
     dataHandler.showDetailsIcon.setImageResource(allergiesDataProvider.getShowDetailsIcon()); 
     dataHandler.allergieName.setText(allergiesDataProvider.getAllergieName()); 
     dataHandler.showDetailsIcon.setImageResource(allergiesDataProvider.getShowDetails()); 

     allergiesData = getContext().getSharedPreferences("allergiesData", Context.MODE_PRIVATE); 
     allergiesEditor = allergiesData.edit(); 

     String myKey = allergiesData.getString(ALLERIES_KEY,"00000000"); 
     keys = myKey.toCharArray(); 

     if(keys[position]=='0') 
      dataHandler.checkBox.setChecked(false); 
     else 
      dataHandler.checkBox.setChecked(true); 

     dataHandler.infoLayout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // Toast.makeText(getContext(),"no elo",Toast.LENGTH_LONG).show(); 
       if (!allergiesDataProvider.isDetailsShows()) { 
        allergiesDataProvider.setIsDetailsShows(true); 
        LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        dataHandler.detailsLayout.removeAllViews(); 
        dataHandler.detailsLayout.addView(inflater.inflate(allergiesDataProvider.getDetailsLayout(), dataHandler.detailsLayout, false)); 
        dataHandler.showDetailsIcon.setImageResource(allergiesDataProvider.getHindDetails()); 

       } else { 
        allergiesDataProvider.setIsDetailsShows(false); 
        dataHandler.detailsLayout.removeAllViews(); 
        dataHandler.showDetailsIcon.setImageResource(allergiesDataProvider.getShowDetails()); 
       } 
      } 
     }); 
     dataHandler.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (isChecked) 
        keys[position] = '1'; 
       else 
        keys[position] = '0'; 
       String myString = String.valueOf(keys); 
       allergiesEditor.putString(ALLERIES_KEY,myString).apply(); 
       //Toast.makeText(getContext(),allergiesData.getString(ALLERIES_KEY,"Sd"),Toast.LENGTH_LONG).show(); 
      } 
     }); 
     return view; 
    } 
} 

答えて

0

リストビューはそれ自身の上にスクロール可能であるとScrollViewに包まれたべきではありません。あなたのために、あなたは単にListViewをそのまま持ち、リストビューの最後のビューとしてボタンを持っていなければなりません。これを実現するには、アダプタのgetview()メソッドを変更する必要があります。このインデックスに基づいて、ボタンを表示するビューが返されます。

+0

を試してみることをお勧め、あなたはこの効果を作る方法を私に説明できますか? – barmi

0

私は私が私のポストを編集して、そこアダプタのコードを入れて、あなたがこの方法のようにボタンとしてRecyclerView with footerを使用し、またHFRecyclerView

public class HeaderFooterAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    private static final int TYPE_HEADER = 0; 
    private static final int TYPE_ITEM = 1; 
    private static final int TYPE_FOOTER = 2; 

    ArrayList<Generic> generics; 
    Context context; 

    public HeaderFooterAdapter(Context context, ArrayList<Generic> generics) { 
     this.context = context; 
     this.generics = generics; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder (ViewGroup parent, int viewType) { 
     if(viewType == TYPE_HEADER) { 
      View v = LayoutInflater.from (parent.getContext()).inflate (R.layout.header_item, parent, false); 
      return new HeaderViewHolder (v); 
     } else if(viewType == TYPE_FOOTER) { 
      View v = LayoutInflater.from (parent.getContext()).inflate (R.layout.footer_item, parent, false); 
      return new FooterViewHolder (v); 
     } else if(viewType == TYPE_ITEM) { 
      View v = LayoutInflater.from (parent.getContext()).inflate (R.layout.list_item, parent, false); 
      return new GenericViewHolder (v); 
     } 
     return null; 
    } 

    private Generic getItem (int position) { 
     return generics.get (position); 
    } 


    @Override 
    public void onBindViewHolder (RecyclerView.ViewHolder holder, int position) { 
     if(holder instanceof HeaderViewHolder) { 
      HeaderViewHolder headerHolder = (HeaderViewHolder) holder; 
      headerHolder.txtTitleHeader.setText ("Header"); 
      headerHolder.txtTitleHeader.setOnClickListener (new View.OnClickListener() { 
       @Override 
       public void onClick (View view) { 
        Toast.makeText (context, "Clicked Header", Toast.LENGTH_SHORT).show(); 
       } 
      }); 
     } else if(holder instanceof FooterViewHolder) { 
      FooterViewHolder footerHolder = (FooterViewHolder) holder; 
      footerHolder.txtTitleFooter.setText ("Footer"); 
      footerHolder.txtTitleFooter.setOnClickListener (new View.OnClickListener() { 
       @Override 
       public void onClick (View view) { 
        Toast.makeText (context, "Clicked Footer", Toast.LENGTH_SHORT).show(); 
       } 
      }); 
     } else if(holder instanceof GenericViewHolder) { 
      Generic currentItem = getItem (position - 1); 
      GenericViewHolder genericViewHolder = (GenericViewHolder) holder; 
      genericViewHolder.txtName.setText (currentItem.getName()); 
     } 
    } 

    // need to override this method 
    @Override 
    public int getItemViewType (int position) { 
     if(isPositionHeader (position)) { 
      return TYPE_HEADER; 
     } else if(isPositionFooter (position)) { 
      return TYPE_FOOTER; 
     } 
     return TYPE_ITEM; 
    } 

    private boolean isPositionHeader (int position) { 
     return position == 0; 
    } 

    private boolean isPositionFooter (int position) { 
     return position == generics.size() + 1; 
    } 

    @Override 
    public int getItemCount() { 
     return generics.size() + 2; 
    } 

    class FooterViewHolder extends RecyclerView.ViewHolder { 
     TextView txtTitleFooter; 

     public FooterViewHolder (View itemView) { 
      super (itemView); 
      this.txtTitleFooter = (TextView) itemView.findViewById (R.id.txtFooter); 
     } 
    } 

    class HeaderViewHolder extends RecyclerView.ViewHolder { 
     TextView txtTitleHeader; 

     public HeaderViewHolder (View itemView) { 
      super (itemView); 
      this.txtTitleHeader = (TextView) itemView.findViewById (R.id.txtHeader); 
     } 
    } 

    class GenericViewHolder extends RecyclerView.ViewHolder { 
     TextView txtName; 

     public GenericViewHolder (View itemView) { 
      super (itemView); 
      this.txtName = (TextView) itemView.findViewById (R.id.txtName); 
     } 
    } 
} 
関連する問題