Putting a Textview on top of a List Fragment

2019-04-09 20:20发布

问题:

How Can I add a textview on top of a fragment. I'm using the following adapter to populate the listfragment and the xml file is each row in the list fragment. I need to add a textview ontop of listview which must be scrollable along with the list?

     public class Adapter extends BaseAdapter {
    Context context;

    public TextView txtName;
    public TextView txtTitle;


    private LayoutInflater mInflater;
    private Storage storage;
    FontManager fontManager;
    Typeface typeface;

    public Adapter(Context _context,Storage _storage) {
        context = _context;

        mInflater = LayoutInflater.from(context);
        this.storage = _storage;

        fontManager = new FontManager(_context);
        typeface = fontManager.getTypeFace();

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return _storage.size();
    }

    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub

        convertView = mInflater.inflate(R.layout.row3, null);

        txtName = (TextView) convertView.findViewById(R.id.tvName);
        txtName.setTypeface(typeface);
        txtName.setText(storage.getName(position));

        txtTitle = (TextView) convertView.findViewById(R.id.tvTitle);
        txtTitle.setTypeface(typeface);
        txtTitle.setText(storage.getTitle(position));

        return convertView;
    }
}

xml:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:orientation="vertical"
    android:padding="20dp"
    android:scrollbars="none" 
    android:id="@+id/ll1">

    <TextView
        android:id="@+id/tvName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textColor="@android:color/black"
        android:textSize="20sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textColor="@android:color/black" />

</LinearLayout>

ListFragment:

    public class SampleListFragment extends ListFragment {

    int number;

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        number = getArguments().getInt(
                "num", 0);
        new SampleAsyncTask(this, getActivity(), number).execute();
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // TODO Auto-generated method stub      
        }
    }
}

Following code is used in AsyncTask class to populate the list fragment

Adapter adapter = new Adapter(context, storage);
listFragment.setListAdapter(adapter);

回答1:

You can do as below or add a textview as a header to your listivew

Quoting from the docs

ListActivity(ListFragment is similar) has a default layout that consists of a single, full-screen list in the center of the screen. However, if you desire, you can customize the screen layout by setting your own view layout with setContentView() in onCreate(). To do this, your own view MUST contain aListView` object with the id "@android:id/list" (or list if it's in code)

activity_main.xml

 <RelativeLayout 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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

     <fragment android:name="com.example.listfragment.MyFragment"
            android:id="@+id/frag"
            android:layout_above="@+id/button1"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />


</RelativeLayout>

MyFragment.java

public class MyFragment extends ListFragment {

    String names[] ={"A","B","C"};
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);
    }
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
       Bundle savedInstanceState) {
      View myFragmentView = inflater.inflate(R.layout.list_frag, container, false);
      TextView tv = (TextView) myFragmentView.findViewById(R.id.textView1);
      tv.setText("My Header");
      setListAdapter(new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1,names));
      return myFragmentView;
     }
     @Override
     public void onListItemClick(ListView l, View v, int position, long id) {
         // on click display the item in toast
          Toast.makeText(getActivity(), (String)l.getItemAtPosition(position), Toast.LENGTH_SHORT).show();
         }
}

list_frag.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:text="TextView" />

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true" >

    </ListView>

</RelativeLayout>

snap shot

Edit: if you want the textview to scroll

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="19dp"
        android:text="TextView" />

</RelativeLayout>

Before calling setListAdapter

  View view = inflater.inflate(R.layout.text, null);
  TextView textinlfated = (TextView) view.findViewById(R.id.textView1);
  ListView lv = getListView();
  textinlfated.setText("TextView scrolls");
  lv.addHeaderView(view);


回答2:

change adapter's getView method and put a case on position and in case of 0, return your textview in other cases listview items.