【问题标题】:what is the best wat to call a fragment onListItemClick, afraid of using a large amount of fragments什么是最好的wat调用片段onListItemClick,害怕使用大量片段
【发布时间】:2014-06-16 12:53:24
【问题描述】:

我正在开发一个大型游戏指南应用程序。该网站的导航是通过导航抽屉进行的,该抽屉上有一个指向 5 个游戏的按钮。每个按钮都会将您带到要招募的角色列表视图。我希望发生的是,当您单击列表项时,它会将您带到显示该角色信息的片段。但是每个游戏都有超过 100 个角色,这可能是个问题。该应用程序的结构如下

MainActivity (Drawer/Activity) > Game1 (ListView/Fragment) > Character Info (Fragment)

角色信息片段尚未创建,因为我不知道该怎么做。我对它进行了很多研究,并且感觉我需要在单击 ListView 项时将 ListView 片段替换为 Character 片段。但是我如何只调用一个片段并将每个字符信息加载到那个片段中。否则我将不得不创建超过 500 个片段……那是不对的。下面是 ListView 片段的代码。

SuikodenFragment(对于游戏 1 - 持有 ListView)

public class SuikodenFragment extends Fragment implements OnItemClickListener {

ListView listView;
ArrayAdapter<Model> adapter;
List<Model> list = new ArrayList<Model>();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public  View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) { 
    // Inflate the layout for this fragment
    View view =  inflater.inflate(R.layout.suikoden_main_activity1, container, false);
    listView = (ListView) view.findViewById(R.id.my_list);
    adapter = new SuikodenListAdapter(getActivity(),getModel());
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(this);

    return view;
}

@Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) {
    TextView label = (TextView) v.getTag(R.id.label);
CheckBox checkbox = (CheckBox) v.getTag(R.id.check);
Toast.makeText(v.getContext(), label.getText().toString()+" "+isCheckedOrNot(checkbox), Toast.LENGTH_LONG).show();
}

private String isCheckedOrNot(CheckBox checkbox) {
    if(checkbox.isChecked())
    return "is checked";
    else
    return "is not checked";
}

private List<Model> getModel() {
    list.add(new Model("Tir (Hero)"));

...more characters follow...

  }

}

我找到了this,这可能是我需要的。但正如我所说,我看不到如何将字符数据加载到一个片段中。我是初学者,如果我没有意义,我很抱歉,如果需要,我会尝试进一步解释。谢谢!

【问题讨论】:

  • 也许您可以使用一个片段来获取字符详细信息,并且只显示取决于字符的文本,不是吗?
  • @NickolaiAstashonok 这就是我的想法,但不知道该怎么做。我还是个初学者,所以考虑这些东西可能会有点混乱
  • 这是最好的方法 :) developer.android.com/training/basics/fragments/… 阅读这篇文章以了解如何在片段/活动之间传输数据
  • 如果你使用的是Android Studio,那么通过默认模板创建的fragment-activity,遵循同样的模式,
  • @NickolaiAstashonok 谢谢你,我会再看一遍,因为我第一次没有太注意它

标签: android listview android-fragments android-listview


【解决方案1】:

你可以从一个fragment调用activity的方法,让activity来决定做什么;是否替换列表或开始新活动。方法说明here

说明

在您的 onItemClick 中,您无需处理导航(即创建和注入字符片段),而是调用您指定的自定义接口的实例

public class CharacterListFragment extends Fragment {
    public static interface OnSelectCharacterHandler() {
        void onCharacterSelect(int id);
    }

    // your code goes here...

    public void onItemClick(...) {
        // get the characterId
        ((OnSelectCharacterHandler) getActivity()).onCharacterSelect(characterId);
    }
}

在您的活动中

public class GameActivity extends Activity implements OnSelectCharacterHandler {
    public void onCharacterSelect(int id) {
        // inject the character fragment or start the activity.
    }
}

建议

与其添加许多不同的片段/活动,不如尝试概括应用程序本身?

根据您提供的内容,很明显,如果单个游戏有 100 个字符3,用户实际上可能看不到所有 100 个字符的详细信息3你已经创建,用户将一次对一个或两个字符感兴趣。

要获取一两个角色的详细信息,下载一个 30-40MB 的应用程序将是多余的,因为常识要求访问该角色的游戏 wiki 并将其添加到离线阅读列表中浏览器。这意味着您的应用失去了优势。

因此,这里有一些建议可以使应用程序更干净、更易于实施和使用。

  • 在主视图中显示游戏列表1。 (使用NavigationDrawer/GridView/ListView/你的名字
  • 为单个游戏概括角色视图。2(显示 HP、MP、...)
  • 从源1填充广义字符视图。无需为不同的角色创建不同的片段。

1:从远程url获取源码,缓存到本地。

2:您可以继续为其他游戏概括角色画面,或者为不同的游戏使用不同的视图。

3:如果有n游戏,那么当前方法创建的片段将达到n*100

高级:不再将所有数据存储在本地,您可以在达到限制后删除用户最少使用的数据到达。

【讨论】:

  • 谢谢!这非常有帮助!当您提到远程 url 时,您指的是使用 mysql 数据库吗?因为我一直在研究那个。然后根据我点击的字符加载正确的数据?
  • @theCreed,远程 url 通常是一个 REST 客户端,您可以从那里将数据与本地数据库同步。如果你想实现类似的东西,请看这个演讲:youtube.com/watch?v=xHXn3Kg2IQE。如果您认为这对您来说太过分了,那么我建议您先做一个简单的 REST 客户端并在深入研究之前先学习该平台。
  • @theCreed 如果这回答了问题,那么请将其标记为已回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
相关资源
最近更新 更多