listview隐藏在方向改变android

时间:2016-04-29 04:30:20

标签: android listview fragment

我在片段(From Api)中使用自定义列表视图。在方向更改数据仍然在数组列表中,列表视图也会得到通知,但它会在屏幕旋转时隐藏。 这是代码:

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);
    }

}

4 个答案:

答案 0 :(得分:1)

您需要再次将数据加载到ListView。您正在将ListView绑定到适配器,您需要在onConfigurationChanged()方法中执行此操作。

答案 1 :(得分:0)

当方向改变时,活动会再次重新加载。所以你必须覆盖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
        }
    }

答案 2 :(得分:0)

在资源中创建一个目录layout-land复制你的.xml文件,根据格局布局对齐并设置container_name和Button。如果Edittext没有做到,可以解决你的问题获得足够的空间以横向布局显示

答案 3 :(得分:0)

在上面的onViewCreated(View view, Bundle savedInstanceState)方法中,您每次都会设置新的空arraylist。因此,即使setRetainInstance(true)

保留了已加载的项,也会从适配器中删除

所以你应该有一个包含arraylist的Field并将该字段传递给适配器

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();
    }
}

然后在private void listView(String response)方法中,将项目添加到上面创建的列表视图

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