在Android中动态呈现不同视图的最佳方法?

时间:2018-08-24 18:28:27

标签: java android

我是Android开发的新手,我对在Android中动态呈现不同视图的最佳方法感到困惑。

我有一个活动,该活动搜索信息数据库,并通过可扩展的列表视图向用户显示结果。就目前而言,xml布局文件仅具有可扩展的列表视图。该元素最初是空白的,但是当用户执行搜索时会被填充。

我的问题是,如果尚未填充可扩展列表视图,我想向用户(指令)显示一条消息,并且我不确定执行此操作的最佳方法是什么?我应该在运行时动态添加另一个视图还是有更好的方法来完成此操作?

5 个答案:

答案 0 :(得分:0)

我所能做的就是在xml文件中创建一个视图(ImageView, Button, ProgressBar, whatever you want to use to display a message for user),并在从Data Base获取数据之前对其进行显示。获取数据后,隐藏视图。

答案 1 :(得分:0)

最简单的方法是在布局中使用2个独立的视图。首先,将显示说明文字,一旦获取数据,您就可以隐藏视图并显示列表。

以下是您可以做的事情的核心:

布局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent" > 

     <TextView
          android:id="@+id/explanation_view"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:text="@string/explanation"
          android:visibility="visible"/>

     <ListView
          android:id="@+id/list_view"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:visibility="gone"/>
</FrameLayout>

Java:

void onData(Data data) {
    explanationView.setVisibility(View.GONE);
    listView.setVisibility(View.VISIBLE);
}

答案 2 :(得分:0)

一种选择是使用所谓的“空视图”。空视图是当没有数据加载到列表/网格时显示给用户的视图。它们是一种很好的,易于使用的方式,可以告诉用户没有要显示的内容。在您的用例中,它们还可以作为向用户指示如何加载数据的指示。

有多种方法可以实现此目的(很难在不看更多代码的情况下就知道哪一个最简单或最适合您),但是基本概念是相同的:在布局中添加“空视图” XML文件。可以是任何您想要的东西,但是要使您大致了解外观,请查看Material Design guidelines关于该主题必须说些什么。给空视图一个初始可见性View.VISIBLE,然后在每次更新列表的View.GONE时将其设置为View.VISIBLEExpandableListAdapter。如果适配器为空,请将空视图设置为View.VISIBLE,否则将其设置为View.GONE。如果您需要更具体的指导(例如一些实际代码),我们将不得不查看您的更多代码以显示如何加载数据。

答案 3 :(得分:0)

您可以将框架布局作为根布局,并添加要在列表为空时显示的布局,然后将其作为第二个子项列出。并且您需要管理它们在不同事件上的可见性。

注意:-在使用框架布局时,如果最后一个子项在layout_gravity相同的情况下显示在其他子项的上方。在“框架布局”中,可以通过设置其layout_gravity属性来对齐视图。

答案 4 :(得分:0)

正确的方法是将Fragments与LoaderManager.LoaderCallbacks一起使用。 在发出请求时,如果它不返回任何数据,则将显示EmptyView;如果没有Internet连接,还将显示EmptyView。 当LoaderManager包含一些数据时,它将自动用列表视图替换EmptyView:

public class ListActivity extends AppCompatActivity{
   private ViewPager viewPager;
   private CategoryAdapter adapter;

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_listados);
        ToolBar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        FragmentManager fragmentManager = getSupportFragmentManager();
        adapter = new CategoryAdapter(fragmentManager);
        viewPager.setAdapter(adapter);
   }
}

CategoryAdapter类可能是这样的:

public class CategoryAdapter extends FragmentPagerAdapter {

    public CategoryAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return new ListFragment();
    }

    @Override
    public int getCount() {
        return 1;
    }
}

Fragment类可能是这样的:

public class ListFragment extends Fragment implements LoaderManager.LoaderCallbacks <List <Item >> {

    private View rootView;
    private ListView listView;
    private ListItemAdapter listItemAdapter;
    private List <Item> listItem = new ArrayList <> ();
    public static final int LOADER_ID = 0;
    
    public ListFragment () {

    }

    @Override
    public View onCreateView (final LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        rootView = inflater.inflate (R.layout.component_list, container, false);
        listItemAdapter = new ListItemAdapter (getActivity (), listItem);
        listView = rootView.findViewById (R.id.list);
        emptyImageView = rootView.findViewById (R.id.empty_list_item);
        ConnectivityManager connMgr = (ConnectivityManager)
        getContext (). getSystemService (Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo ();
        if (networkInfo! = null && networkInfo.isConnected ()) {
            if (getActivity (). getSupportLoaderManager (). getLoader (LOADER_ID) == null) {
                listView.setEmptyView (rootView.findViewById (R.id.connection_progress));
                getActivity (). getSupportLoaderManager (). initLoader (LOADER_ID, null, this) .forceLoad ();
            } else {
                listView.setEmptyView (rootView.findViewById (R.id.empty_list_item));
            }
        } else {
            listView.setEmptyView (rootView.findViewById (R.id.no_connection_list_item));
        }
        listView.setAdapter (listItemAdapter);
        return rootView;
    }

    @Override
    public Loader <List <Item >> onCreateLoader (int id, Bundle args) {
        return new ItemLoader (getActivity (), LOADER_ID);
    }

    @Override
    public void onLoadFinished (Loader <List <Item >> loader, List <Item> data) {
        if (data.size () == 0) {
            listView.setEmptyView (rootView.findViewById (R.id.empty_list_item));
        } else {
          listItem = data;
          listItemAdapter.setListItem (data);
          listView.setAdapter (listItemAdapter);
          listItemAdapter.notifyDataSetChanged ();
        }
    }

    @Override
    public void onLoaderReset (Loader <List <Item >> loader) {
        listItemAdapter.setListItem (new ArrayList <Item> ());
    }

}

Adapter类可能是这样的:

public class ListItemAdapter extends ArrayAdapter<Item> {
    Context context;
    public static List<Item> listItem = new ArrayList<>();
    private Item item = new Item();
    public ListItemAdapter(Context context, List<Item> listItem) {
        super(context, 0, listItem);
        this.context = context;
        this.listItem = listItem;
    }

    private static class ViewHolder {
        TextView titleTextView;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final Resources res = context.getResources();
        ViewHolder holder;
        View listItemView = convertView;
        if (listItemView == null) {
            listItemView = LayoutInflater.from(getContext()).inflate(
                    R.layout.list_item_layout, parent, false);
            holder = new ViewHolder();
            listItemView.setTag(holder);
        } else {
            holder = (ViewHolder) listItemView.getTag();
        }
holder.titleTextView.setText(res.getString(R.string.title_text,item.getTitle()));
        return listItemView;
    }

    public void setListItem(List<Item> data) {
        listItem.clear();
        listItem.addAll(data);
        notifyDataSetChanged();
    }

}