2016-04-29 47 views
0

我正在使用自定义列表视图片段(从Api)。在方向更改数据仍在数组列表中,并且列表视图也会得到通知,但屏幕旋转时会隐藏。 这里是代码:listview隐藏取向变化android

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

} 

回答

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 
     } 
    } 
+0

谢谢。我昨天失去了那份工作。 –

+0

不客气,我很高兴我能帮到 – AbhayBohra

+0

我已经把布局也放在layout-land文件夹中。而这种方法并没有呼吁方向转变。 @Override public void onConfigurationChanged(Configuration newConfig){ super.onConfigurationChanged(newConfig); (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ readingAdapter(lstItem); } if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)readingAdapter(lstItem); } } –

1

您需要重新加载数据到ListView。您将ListView绑定到适配器,您需要在方法中执行此操作。

0

建立在资源的目录结构,土地复制那里的.xml文件调整和设置Edittext和按钮按照景观布局。可能是它解决了你的问题,如果listview行的事没有得到足够的空间来在横向布局中显示

0

在上面的onViewCreated(View view, Bundle savedInstanceState)方法中,您每次都设置新的空数组列表。因此,这被载入根据前述项目从适配器删除,即使它是由setRetainInstance(true)

保留所以,你应该有保存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(); 
    } 
} 

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

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

谢谢我所做的一样。只是想知道现在如果我使用Override onConfig方法,然后列表视图旋转时丢失滚动位置。但在(如你所说)的情况下,它并没有失去其滚动位置。我不想保存和恢复滚动位置的状态。为什么它不工作,如果我使用Override OnConfig方法 –

+0

ListView处理这些状态为你保存的东西,但我不知道它是如何完成的。但是当你使用OnConfig方法时,如果你需要保存滚动状态,你必须这样做。 – arjun