当片段视图行项目具有隐藏视图时,片段不尊重匹配的父级高度 [英] Fragment doesn't respect match parent height when having listview row item has hidden view in it

查看:92
本文介绍了当片段视图行项目具有隐藏视图时,片段不尊重匹配的父级高度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的应用程序中出现了一个奇怪的问题.在我的一项应用活动中,我在其中添加了三个带有标签的片段.一切正常. 在我遇到问题的片段中,我有使用适配器和Web服务数据膨胀的listview.这也很好.现在的问题是适配器中已膨胀的行具有一个在xml中具有visibility=gone的隐藏视图.在从该行点击imageview时,我通过Java代码使该布局可见.问题是布局在点击时不可见. 我什至在imageview的onClickListener上设置了断点,它的确执行了将可见性从go变为visible的行.我无法理解是什么原因导致此问题,因为我在其他屏幕上使用相同的行xml并使用了相同的数据,因此可以正常工作.

I am having a weird issue in my app. In one of my app activity I am inflating three fragments in it with tabs. Everything works fine. In the fragment in which I am having problem, I have listview which is inflated using adapter and data fro web service. This also works well. Now the problem is this the row which is inflated in adapter, has a hidden view which has visibility=gone in xml. On tap of imageview from that row I make that layout visible through java code. The problem is layout doesn't become visible on tap. I have even set breakpoint on the onClickListener of imageview and it does execute the line which changes the visibility from gone to visible. I am unable to understand what is causing this issue as I am using the same row xml with same data in other screen and there it is working perfectly.

更新

我知道是什么导致了此问题,但不知道如何解决.在我的活动中,我有三个片段.我为片段提供的视图(其中片段将被充气)引起了主要问题.我已经设置了高度宽度以匹配父级,但是它没有采用匹配父级的高度.如果片段仅包含普通视图(例如textview,imageview),则片段也会正确显示.但是问题是,如果片段由listview组成,则仅占用提供给listview的自定义行的高度.我可以在该空间中滚动查看完整的listview. 我不明白是什么原因导致了这种行为. 我的更新代码.

I got to know what's causing this issue but don't know how to solve this. In my activity I am having three fragments. The view that I provided for fragment(in which fragment will be inflated) is causing main problem. I have set height width to match parent but it is not taking match parent height. If the fragment just includes normal views like textview, imageview then also fragment is shown properly.But the problem is if fragment consists of listview, then it only takes height of the custom row that is supplied to the listview. I am able to scroll complete listview in that space. I don't understand what is causing this behaviour. My Updated code.

主布局xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <include layout="@layout/header_1" />



<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="#000"
    android:weightSum="3"
    android:orientation="horizontal">
    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:weightSum="1"
        android:orientation="horizontal"
        android:id="@+id/lin_birds">
        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:text="@string/aves"
            android:textColor="#ffffff"
            android:gravity="center"
            android:layout_gravity="center"
            android:layout_weight="0.99"
            android:id="@+id/fragment_aves"/>
        <View
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_weight="0.01"
            android:background="#ffffff"
            android:layout_marginTop="10dp"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:weightSum="1"
        android:orientation="horizontal">
        <TextView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:text="@string/routes"
            android:textColor="#ffffff"
            android:gravity="center"
            android:layout_gravity="center"
            android:layout_weight="0.99"
            android:id="@+id/fragment_routes"/>
        <View
            android:layout_width="0dp"
            android:layout_height="30dp"
            android:layout_weight="0.01"
            android:background="#ffffff"
            android:layout_marginTop="10dp"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="horizontal">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="@string/information"
            android:textColor="#ffffff"
            android:gravity="center"
            android:layout_gravity="center"
            android:id="@+id/fragment_information"/>

    </LinearLayout>
</LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/frame_details" />

    </LinearLayout>
</LinearLayout>

主要活动Java代码

    public class ActivityRoutesDetails extends AppCompatActivity {
    RelativeLayout rel_back;
    TextView tv_title,tv_information,tv_routes,fragment_aves;
    RoutesDataBean routesDataBean;
    LinearLayout frame;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.routes_detail);
        tv_title= (TextView)findViewById(R.id.tv_title);
        tv_information= (TextView) findViewById(R.id.fragment_information);
        tv_routes= (TextView) findViewById(R.id.fragment_routes);
        fragment_aves= (TextView) findViewById(R.id.fragment_aves);
//        frame= (LinearLayout) findViewById(R.id.frame_details);
        routesDataBean= (RoutesDataBean)getIntent().getSerializableExtra("data");
        tv_title.setText(routesDataBean.getDescrip1());

        Fragment fragment=new FragmentRouteInside();
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(R.id.frame_details, fragment);
        fragmentTransaction.commit();
        fragment_aves.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Fragment fragmentBirds=new FragmentRouteBirds();
                FragmentManager fragmentManager = getSupportFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.frame_details, fragmentBirds);
                fragmentTransaction.commit();
            }
        });

        tv_information.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Fragment fragmentRouteInformation = new FragmentRouteInformation();
                FragmentManager fragmentManager = getSupportFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.frame_details, fragmentRouteInformation);
                fragmentTransaction.commit();
            }
        });
        tv_routes.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Fragment fragment=new FragmentRouteInside();
                FragmentManager fragmentManager = getSupportFragmentManager();
                FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.replace(R.id.frame_details, fragment);
                fragmentTransaction.commit();
            }
        });
        rel_back= (RelativeLayout) findViewById(R.id.rel_back);

        rel_back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }
}

片段鸟xml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/lv_bird"/>
    </LinearLayout>

片段Java代码

public class FragmentRouteBirds extends Fragment {
AppSharedPreferences appSharedPreferences;
String REGISTER_URL="";
ListView lv_birds;
private ArrayList<BirdsDataBean> birdsUrlList;
boolean flag=false;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragments_birds, null);
    appSharedPreferences=AppSharedPreferences.getsharedprefInstance(getActivity());
     REGISTER_URL = "http://192.241.162.63/appvist/v1/routebird/"+appSharedPreferences.getRouteId();
    birdsUrlList = new ArrayList<>();
    lv_birds = (ListView) root.findViewById(R.id.lv_bird);
    LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) lv_birds.getLayoutParams();
    lp.height = LinearLayout.LayoutParams.MATCH_PARENT;
    lv_birds.setLayoutParams(lp);
    hitBirdsService();
    return root;
}
private void hitBirdsService() {
    class RegisterUser extends AsyncTask<String, Void, String> {
        private ProgressDialog mDialog;
        RequestClass ruc = new RequestClass();
        String response = "";

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mDialog = new ProgressDialog(getActivity());
            mDialog.setMessage("Please Wait ...");
            mDialog.setCancelable(false);
            mDialog.show();
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            mDialog.dismiss();
            parseBirdResponse(response);
            //Toast.makeText(getActivity(), s, Toast.LENGTH_LONG).show();
        }

        @Override
        protected String doInBackground(String[] params) {

            response = RequestClass.GET(REGISTER_URL);

            return response;
        }
    }

    RegisterUser ru = new RegisterUser();
    ru.execute();
}
public void parseBirdResponse(String response) {
    //String descrip, String observaciones, String descrip_larga, String url_video, String url
    try {
        JSONObject jsonObject = new JSONObject(response);
        Boolean error = jsonObject.getBoolean("error");
        if (!error) {
            JSONArray jsonArray = jsonObject.getJSONArray("birds");
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonBirds = jsonArray.getJSONObject(i);
                int idave=jsonBirds.getInt("idave");
                String descrip = jsonBirds.getString("descrip");
                String observaciones = jsonBirds.getString("observaciones");
                String descrip_larga = jsonBirds.getString("descrip_larga");
                String url_video = jsonBirds.getString("url_video");
                String url = jsonBirds.getString("url");
                String nombre_cientifico = jsonBirds.getString("nombre_cientifico");
                int flag=jsonBirds.getInt("flag");
                birdsUrlList.add(new BirdsDataBean(flag,idave,descrip, observaciones, descrip_larga, url_video, url, nombre_cientifico));

            }
            ScheduleTaskAdapter scheduleTaskAdapter = new ScheduleTaskAdapter(getActivity(), birdsUrlList);
            lv_birds.setAdapter(scheduleTaskAdapter);
            LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) lv_birds.getLayoutParams();
            lp.height = 800;
            lv_birds.setLayoutParams(lp);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}
public class ScheduleTaskAdapter extends BaseAdapter {
    Context context;
    LayoutInflater layoutInflater;
    // List<InterestAndLanguageBean> interestAndLanguageBeans=new ArrayList<>();
    List<BirdsDataBean> imageList = new ArrayList<>();

    public ScheduleTaskAdapter(Context context, List<BirdsDataBean> imagesList) {
        this.context = context;
        this.imageList = imagesList;
        layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

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

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = layoutInflater.inflate(R.layout.routes_bird_row, parent, false);
            holder.iv_birds = (ImageView) convertView.findViewById(R.id.iv_route_bird);
            holder.frameLayout = (FrameLayout) convertView.findViewById(R.id.frame_route_bird);
            holder.linearLayout = (LinearLayout) convertView.findViewById(R.id.route_bird_detail_view);
            holder.imageView = (ImageView) convertView.findViewById(R.id.iv_hide);
            holder.iv_video = (ImageView) convertView.findViewById(R.id.iv_seen);
            holder.iv_sound = (ImageView) convertView.findViewById(R.id.iv_video);
            holder.tv_short_descript = (TextView) convertView.findViewById(R.id.tv_bird_name);
            holder.tv_category = (TextView) convertView.findViewById(R.id.tv_scientific_name);
            holder.tv_long_description = (TextView) convertView.findViewById(R.id.tv_description);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        Uri myUri = Uri.parse(birdsUrlList.get(position).getUrl());
        Glide.with(getActivity()).load(myUri).placeholder(R.drawable.birds).into(holder.iv_birds);
        holder.tv_short_descript.setText(birdsUrlList.get(position).getDescrip());
        holder.tv_long_description.setText(birdsUrlList.get(position).getDescrip_larga());
        holder.tv_category.setText(birdsUrlList.get(position).getNombre_cientifico());
        final ViewHolder finalHolder = holder;
        holder.frameLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finalHolder.linearLayout.setVisibility(View.VISIBLE);
                finalHolder.iv_sound.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        try {
                            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(birdsUrlList.get(position).getUrl_video())));
                        } catch (ActivityNotFoundException e) {
                            e.printStackTrace();
                        }
                    }
                });
                finalHolder.iv_video.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        //hitBirdSeenService(birdsUrlList.get(position).getIdave());
                       // finalHolder.iv_video.setImageResource(R.drawable.eye_selected);
                    }
                });
            }
        });
        holder.imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finalHolder.linearLayout.setVisibility(View.GONE);
            }
        });
        //Picasso.with(context).load(myUri).placeholder(R.drawable.image).into(holder.pic);
        //malevich.load(helperTaskBeanList.get(position).getImage()).into(holder.pic);
        return convertView;
    }

}
static class ViewHolder {
    ImageView iv_birds,imageView,iv_video,iv_sound;
    FrameLayout frameLayout;
    LinearLayout linearLayout;
    TextView tv_short_descript,tv_category,tv_long_description;
}

}

适配器的行布局

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:id="@+id/frame_route_bird"
        xmlns:android="http://schemas.android.com/apk/res/android">
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="fitXY"
            android:id="@+id/iv_route_bird"/>
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_gravity="bottom"
            android:layout_marginBottom="5dp"
            android:layout_marginLeft="10dp" >
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#ffffff"
                android:text="@string/name"
                android:textSize="24sp"
                android:textStyle="bold"
                android:id="@+id/tv_bird_name"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="15sp"
                android:textColor="#ffffff"
                android:text="@string/bird_sub_category"
                android:id="@+id/tv_scientific_name"/>

        </LinearLayout>
    </FrameLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:visibility="gone"
        android:background="#ffffff"
        android:id="@+id/route_bird_detail_view"
        android:paddingBottom="120dp">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/bird_hidden_text"
            android:textSize="20sp"
            android:padding="20dp"
            android:id="@+id/tv_description"/>
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_gravity="center">
            <ImageView
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:src="@drawable/eye110"
                android:id="@+id/iv_seen"/>
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/right"
                android:layout_marginTop="25dp"
                android:layout_marginLeft="15dp"
                android:id="@+id/iv_arrow"/>
            <ImageView
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:src="@drawable/ear"
                android:layout_marginLeft="15dp"
                android:id="@+id/iv_video"/>
        </LinearLayout>
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="20dp"
            android:background="#D6D6D6"
            android:layout_marginTop="20dp"
            android:src="@drawable/up"
            android:layout_gravity="center"
            android:id="@+id/iv_hide"/>
    </LinearLayout>
</LinearLayout>

以下是问题的屏幕截图

Here are the screenshots of the problem

比较这两个图像,您可以看到隐藏视图出现在单个行项目的空间中,并且可以在该空间完全滚动.

Comparing both images you can see that the hidden view appears in the space of the single row item and is scroll able completely in that space.

推荐答案

对于Android开发人员(克里斯托弗·比尔斯)来说,更好的选择是针对性的:

Better upshot were targeted at plus for android developers (Cristophe Beils):

您的ListView的高度必须设置为match_parent或固定大小,而不是wrap_content.

"Your ListView must have its height set to match_parent or a fixed size, not wrap_content.

如果需要添加固定在ListView底部的另一个视图作为页脚,则需要将ListView和页脚视图都放置在垂直的LinearLayout中,并在ListView上将layout_height设置为0dp并将layout_weight设置为1,以便它会占用剩余的垂直空间."

If you need to add another view fixed at the bottom of the ListView as a footer, you need to put both the ListView and the footer View in a vertical LinearLayout and set layout_height to 0dp and layout_weight to 1 on the ListView so that it takes the remaining vertical space."

这篇关于当片段视图行项目具有隐藏视图时,片段不尊重匹配的父级高度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆