ListView嵌套GridView时的,gridview显示不全的冲突问题

来源:互联网 发布:两人换脸的相机软件 编辑:程序博客网 时间:2024/05/26 19:17

ListView中嵌套GridView时,gridview的内容会显示不全,这就需要自定义GridView,然后重写gridview的onMeasure方法,当然,除了这种方法还有其他方法,本文只总结了这一种,具体如下:

首先是主布局,只有一个ListView

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_test_list_view"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="ht.testxyapp.com.testapp.activity.TestListViewActivity">    <ListView        android:id="@+id/mListView"        android:layout_width="wrap_content"        android:layout_height="wrap_content"></ListView></RelativeLayout>

其次是listview的item布局,本文是两个TextView和一个gridview

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="horizontal">        <TextView            android:id="@+id/tv_name"            android:layout_width="0dp"            android:layout_height="match_parent"            android:layout_weight="1"            android:gravity="left"            android:text="" />        <TextView            android:id="@+id/btnMore"            android:layout_width="0dp"            android:layout_height="match_parent"            android:layout_weight="1"            android:gravity="right"            android:text="更多" />    </LinearLayout>    <ht.testxyapp.com.testapp.widget.MyGridView        android:id="@+id/list1Gridview"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:numColumns="auto_fit"></ht.testxyapp.com.testapp.widget.MyGridView></LinearLayout>
自定义的gridview,只需要重写他的onMeasure方法即可

public class MyGridView extends GridView {    public MyGridView(Context context) {        super(context);    }    public MyGridView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public MyGridView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        int mSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,MeasureSpec.AT_MOST);        super.onMeasure(widthMeasureSpec, mSpec+50);    }}


然后是gridview的item布局,只有一个TextView

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">    <TextView        android:id="@+id/name"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="kll;" /></LinearLayout>

然后是MainActivity,将listview和gridview的适配器添加上即可

package ht.testxyapp.com.testapp.activity;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.GridView;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import ht.testxyapp.com.testapp.R;public class TestListViewActivity extends AppCompatActivity {    private ListView mListView;    private String[] listdata1 = {"组合1", "组合2"};    private String[] gridData1 = {"000","999","888","777","666","555","444","333","222","111"};    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_test_list_view);        mListView = (ListView) findViewById(R.id.mListView);        mListView.setAdapter(new ListAdapter());    }    private class ListAdapter extends BaseAdapter {        @Override        public int getCount() {            return listdata1.length;        }        @Override        public Object getItem(int position) {            return null;        }        @Override        public long getItemId(int position) {            return 0;        }        @Override        public View getView(int position, View convertView, ViewGroup parent) {            View view;            ViewHolder holder;            if (convertView == null) {                view = View.inflate(TestListViewActivity.this, R.layout.item_listview1, null);                holder = new ViewHolder();                holder.tvName = (TextView) view.findViewById(R.id.tv_name);                holder.mGridview = (GridView) view.findViewById(R.id.list1Gridview);                view.setTag(holder);            } else {                view = convertView;                holder = (ViewHolder) view.getTag();            }            holder.tvName.setText(listdata1[position]);            holder.mGridview.setAdapter(new GridAdapter());            holder.mGridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {                @Override                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                    Toast.makeText(TestListViewActivity.this, position+"**", Toast.LENGTH_SHORT).show();                }            });            return view;        }        private class ViewHolder {            TextView tvName;            GridView mGridview;        }    }    private class GridAdapter extends BaseAdapter{        @Override        public int getCount() {            return gridData1.length;        }        @Override        public Object getItem(int position) {            return null;        }        @Override        public long getItemId(int position) {            return 0;        }        @Override        public View getView(int position, View convertView, ViewGroup parent) {            View view;            ViewHolder holder;            if (convertView==null){                view = View.inflate(TestListViewActivity.this,R.layout.item_gridview,null);                holder = new ViewHolder();                holder.name = (TextView) view.findViewById(R.id.name);                view.setTag(holder);            }else{                view=convertView;                holder = (ViewHolder) view.getTag();            }            holder.name.setText(gridData1[position]);            return view;        }        private class ViewHolder{            TextView name;        }    }}

本文是将adapter全部写在了MainActivity里

0 0