简体   繁体   English

listview隐藏方向更改android

[英]listview hide on orientation change android

I am using custom list view inside fragment(From Api). 我在fragment(来自Api)中使用自定义列表视图。 on orientation change data is still in array list and also list view get notified but it hides when screen rotates. 方向更改时,数据仍在数组列表中,并且列表视图也会收到通知,但屏幕旋转时会隐藏。 here is the code: 这是代码:

public class FragNotice extends Fragment implements View.OnClickListener {

    ListAdapter listAdapter;
    ListView listView;
    EditText editTextNotice;
    private Button btnSearch;
    private Button btnClear;
    private int incre = 1;
    private boolean boolScroll = true;

    public FragNotice() {
        // Required empty public constructor
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(getActivity()));
        setRetainInstance(true);
        search(true);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return init(inflater.inflate(R.layout.notice_activity, container, false));
    }

    private View init(View view) {
        editTextNotice = (EditText) view.findViewById(R.id.editTextNotice);
        btnSearch = (Button) view.findViewById(R.id.btnSearch);
        btnSearch.setOnClickListener(this);
        btnClear = (Button) view.findViewById(R.id.btnClear);
        btnClear.setOnClickListener(this);
        listView = (ListView) view.findViewById(R.id.listViewNotice);
        listView.setOnScrollListener(onScrollListener());
        return view;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        if (listAdapter==null) {
            listAdapter=new ListAdapter(getActivity(), new ArrayList<ListRowItem>());
            listView.setAdapter(listAdapter);
            listAdapter.notifyDataSetChanged();
        }
    }

    AsyncRequest.OnAsyncRequestComplete onAsyncRequestComplete = new AsyncRequest
            .OnAsyncRequestComplete() {


        @Override
        public void asyncResponse(String response, int apiKey) {
                switch (apiKey) {
                    case 1:
                        listView(response);
                        break;
                }
        }
    };

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btnClear) {
            incre = 1;
            boolScroll = true;
            editTextNotice.setText(null);
            if (listAdapter != null)
                listAdapter.clear();
            search(true);
        } else if (v.getId() == R.id.btnSearch) {
            String std = editTextNotice.getText().toString();

            if (std.trim().length() > 1) {
                incre = 1;
                boolScroll = true;
                if (listAdapter != null)
                    listAdapter.clear();
                try {
                    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService
                            (Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(new View(getActivity()).getWindowToken(),
                            InputMethodManager.HIDE_NOT_ALWAYS);
                } catch (Exception e) {
                    // TODO: handle exception
                }
                search(false);
            } else
                Toast.makeText(getActivity(),
                        "Please enter atleast two character.", Toast.LENGTH_LONG)
                        .show();
        }
    }


    class ListAdapter extends ArrayAdapter<ListRowItem> {
        private final Context context;


        public ListAdapter(Context asyncTask, java.util.List<ListRowItem> items) {
            super(asyncTask, R.layout.notice_listitem, items);
            this.context = asyncTask;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            final ViewHolder holder;
            final ListRowItem rowItem = getItem(position);

            LayoutInflater mInflater = (LayoutInflater) context
                    .getSystemService(context.LAYOUT_INFLATER_SERVICE);
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.notice_listitem, parent, false);
                holder = new ViewHolder();
                holder.txtSno = (TextView) convertView.findViewById(R.id.txtSno);
                holder.txtNoticePublishDate = (TextView) convertView.findViewById(R.id
                        .txtNoticePublishDate);
                holder.btnView = (Button) convertView.findViewById(R.id.btnView);
                holder.txtNoticeDescription = (TextView) convertView.findViewById(R.id
                        .txtNoticeDescription);
                holder.txtNoticeName = (TextView) convertView.findViewById(R.id.txtNoticeName);


                convertView.setTag(holder);
            } else
                holder = (ViewHolder) convertView.getTag();
            holder.txtSno.setText(String.valueOf(position + 1));
            holder.txtNoticeDescription.setText(new AppUtility().TitleCase(rowItem.getDescription
                    ()));
            holder.txtNoticeName.setText(new AppUtility().TitleCase(rowItem.getFileTitle()));

            try {
                holder.txtNoticePublishDate.setText(String.valueOf((new SimpleDateFormat("dd MMM " +
                        "yyyy HH:mm:ss", Locale.US)).format((new SimpleDateFormat
                        ("yyyy-MM-dd'T'HH:mm:ss", Locale.US)).parse(rowItem.getUpdateDate()))));
            } catch (ParseException e) {
                holder.txtNoticePublishDate.setText(new AppUtility().TitleCase(rowItem
                        .getUpdateDate()));
            }
            holder.btnView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                }
            });
            return convertView;
        }

        /*private view holder class*/
        private class ViewHolder {
            TextView txtSno;
            TextView txtNoticeName;
            TextView txtNoticeDescription;
            TextView txtNoticePublishDate;
            Button btnView;

        }
    }

    class ListRowItem {
        private final String FileTitle;
        private final String Description;
        private final String ContentType;
        private final int DocumentUploadID;
        private final String UpdateDate;

        ListRowItem() {
            this.FileTitle = "";
            this.Description = "";
            this.ContentType = "";
            this.DocumentUploadID = 0;
            this.UpdateDate = "";
        }

        ListRowItem(String fileTitle, String description, String contentType, int
                documentUploadID, String updateDate) {
            this.FileTitle = fileTitle;
            this.Description = description;
            this.ContentType = contentType;
            this.DocumentUploadID = documentUploadID;
            this.UpdateDate = updateDate;
        }

        public String getFileTitle() {
            return FileTitle;
        }

        public int getDocumentUploadID() {

            return DocumentUploadID;
        }

        public String getUpdateDate() {

            return UpdateDate;
        }

        public String getDescription() {
            return Description;
        }

        public String getContentType() {

            return ContentType;
        }
    }

    private void listView(String response) {
        try {
            ArrayList<ListRowItem> lstItem;
            if(listAdapter==null){
                Type listType = new TypeToken<ArrayList<ListRowItem>>() {
                }.getType();
                lstItem = new Gson().fromJson(response, listType);
                listAdapter = new ListAdapter(getActivity(), lstItem);
            } else {
                Type listType = new TypeToken<ArrayList<ListRowItem>>() {
                }.getType();
                lstItem = new Gson().fromJson(response, listType);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                    listAdapter.addAll(lstItem);
                } else {
                    for (ListRowItem items : lstItem) {
                        listAdapter.add(items);
                    }
                }
            }
            if (listAdapter != null)
                listAdapter.notifyDataSetChanged();
        } catch (Exception e) {

        }
    }


    private AbsListView.OnScrollListener onScrollListener() {
        return new AbsListView.OnScrollListener() {


            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                int threshold = 5;
                int count = listView.getCount();

                if (scrollState == SCROLL_STATE_IDLE) {
                    if (listView.getLastVisiblePosition() >= count - threshold) {

                        if (boolScroll) {
                            if (editTextNotice.getText().toString().trim().length() > 0)
                                search(false);
                            else
                                search(true);

                        }
                    }
                }
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
                                 int totalItemCount) {
            }
        };
    }

    private void search(boolean bool) {
        String URL;
        if (bool) {
            URL = new SqLite(getActivity()).returnDefaultURI() + "notice/0/" + incre;
            incre = incre + 1;
        } else {
            URL = new SqLite(getActivity()).returnDefaultURI() + "notice/" +
                    editTextNotice.getText().toString().trim() + "/" + incre;
            incre = incre + 1;
        }

        AsyncRequest asyncRequest;
        if (incre > 2)
            asyncRequest = new AsyncRequest(onAsyncRequestComplete, getActivity(), "GET", null,
                    null, 1);
        else
            asyncRequest = new AsyncRequest(onAsyncRequestComplete, getActivity(), "GET", null,
                    "Fetching data", 1);

        asyncRequest.execute(URL);
    }

}

You need to load the data into the ListView again. 您需要再次将数据加载到ListView You are binding the ListView to an adapter, you need to do it in onConfigurationChanged() method. 您要将ListView绑定到适配器,需要在onConfigurationChanged()方法中进行操作。

When orientation changes the activity reloads again.So you have to override onConfigurationChanged method. 当方向改变时,活动会重新加载。因此,您必须重写onConfigurationChanged方法。

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {

            //Your Code Here
        }
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            //Your Code Here
        }
    }

在资源中创建目录布局-将您的.xml文件复制到Edittext并根据横向布局对齐并设置Edittext和Button。如果listview没有足够的空间来显示横向布局,则可能解决了您的问题

In onViewCreated(View view, Bundle savedInstanceState) method above you are setting new empty arraylist every time. onViewCreated(View view, Bundle savedInstanceState)方法中,您每次都设置新的空arraylist。 So the previous items which are loaded are removed from adapter even though it is retained by setRetainInstance(true) 因此,即使setRetainInstance(true)保留了以前加载的项目,也将其从适配器中删除

So you should have a Field that holds the arraylist and pass that field to adapter 因此,您应该有一个包含arraylist的字段并将该字段传递给适配器

private ArrayList<ListRowItem> listItems = new ArrayList<>()

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    if (listAdapter==null) {
        listAdapter=new ListAdapter(getActivity(), listItems);//pass the Arraylist here
        listView.setAdapter(listAdapter);
        listAdapter.notifyDataSetChanged();
    }
}

Then in private void listView(String response) method, add items to that listview created above as 然后在private void listView(String response)方法中,将项目添加到上面创建的listview中,如下所示:

   listItems = new Gson().fromJson(response, listType);
   listAdapter.notifyDataSetChanged();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM