Android:如何使按钮指向 ListView 项目详细信息(在不同的活动中)(主/详细流程)
Android: How to make a Button Lead to a ListView item details (In differents Activities) (Master / Detail Flow)
我是 Android 开发的初学者。
我知道,这个标题似乎很难理解,但请让我解释一下
我的应用程序是我所在城市的公交线路指南,它包含两个不同的视图:
- A
ListView
所有公交线路的数字,简单顺序,没有
特别的。它恰好包含 100 个项目。
- A
NavigationDrawer
IN ANOTHER ACTIVITY 具有相同的线条,但按区域(北、南、东、东南)分隔
每个 NavigationDrawer
菜单都指向一个 Activity,其中有几个按钮和公交线路,但只有那些属于 X 区(例如东部)的按钮和公交线路
这里是Activity东的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="6dp"
android:paddingBottom="6dp"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:showIn="@layout/activity_leste" tools:context="com.lennoardsilva.teresinabus.Leste">
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/scrollView2"
android:layout_alignParentTop="true">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_245"
android:id="@+id/botao_l_245" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_401"
android:id="@+id/botao_l_401" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_402"
android:id="@+id/botao_l_402" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_403"
android:id="@+id/botao_l_403" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_404"
android:id="@+id/botao_l_404" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_405"
android:id="@+id/botao_l_405" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_501"
android:id="@+id/botao_l_501" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_502"
android:id="@+id/botao_l_502" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_503"
android:id="@+id/botao_l_503" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_512"
android:id="@+id/botao_l_512" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_513"
android:id="@+id/botao_l_513" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_518"
android:id="@+id/botao_l_518" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_520"
android:id="@+id/botao_l_520" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_521"
android:id="@+id/botao_l_521" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_522"
android:id="@+id/botao_l_522" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_523"
android:id="@+id/botao_l_523" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_610"
android:id="@+id/botao_l_610" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/carregar_mais"
android:id="@+id/botao_carregar_leste"
android:background="@color/cinza_escuro"
android:textColor="@color/branco"
android:textStyle="bold"
android:onClick="leste_2"
android:visibility="gone" />
</LinearLayout>
</ScrollView>
</RelativeLayout>
<!-- As a told you, a lot of buttons -->
此处 LineListFragment:
package com.lennoardsilva.teresinabus;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.lennoardsilva.teresinabus.dummy.DummyContent;
public class LinhaListFragment extends ListFragment {
private static final String STATE_ACTIVATED_POSITION = "activated_position";
private Callbacks mCallbacks = sDummyCallbacks;
private int mActivatedPosition = ListView.INVALID_POSITION;
public interface Callbacks {
public void onItemSelected(String id);
}
private static Callbacks sDummyCallbacks = new Callbacks() {
@Override
public void onItemSelected(String id) {
}
};
public LinhaListFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(),android.R.layout.simple_list_item_activated_1, android.R.id.text1, DummyContent.ITEMS));
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (savedInstanceState != null && savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) {
setActivatedPosition(savedInstanceState.getInt(STATE_ACTIVATED_POSITION));
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// Activities containing this fragment must implement its callbacks.
if (!(activity instanceof Callbacks)) {
throw new IllegalStateException("Activity must implement fragment's callbacks.");
}
mCallbacks = (Callbacks) activity;
}
@Override
public void onDetach() {
super.onDetach();
mCallbacks = sDummyCallbacks;
}
@Override
public void onListItemClick(ListView listView, View view, int position, long id) {
super.onListItemClick(listView, view, position, id);
mCallbacks.onItemSelected(DummyContent.ITEMS.get(position).id);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (mActivatedPosition != ListView.INVALID_POSITION) {
outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition);
}
}
public void setActivateOnItemClick(boolean activateOnItemClick) {
getListView().setChoiceMode(activateOnItemClick ? ListView.CHOICE_MODE_SINGLE : ListView.CHOICE_MODE_NONE);
}
private void setActivatedPosition(int position) {
if (position == ListView.INVALID_POSITION) {
getListView().setItemChecked(mActivatedPosition, false);
} else {
getListView().setItemChecked(position, true);
}
mActivatedPosition = position;
}
}
这里是行列表Activity:
public class LinhaListActivity extends AppCompatActivity
implements LinhaListFragment.Callbacks {
private boolean mTwoPane;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_linha_app_bar);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setTitle(getTitle());
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DialogFragment dialog = new FragmentoDatabase();
dialog.show(getFragmentManager(), "FragmentoDatabaseTag");
}
});
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
if (findViewById(R.id.linha_detail_container) != null) {
mTwoPane = true;
((LinhaListFragment) getSupportFragmentManager()
.findFragmentById(R.id.linha_list))
.setActivateOnItemClick(true);
}
// TODO: If exposing deep links into your app, handle intents here.
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onItemSelected(String id) {
if (mTwoPane) {
Bundle arguments = new Bundle();
arguments.putString(LinhaDetailFragment.ARG_ITEM_ID, id);
LinhaDetailFragment fragment = new LinhaDetailFragment();
fragment.setArguments(arguments);
getSupportFragmentManager().beginTransaction().replace(R.id.linha_detail_container, fragment).commit();
} else {
Intent detailIntent = new Intent(this, LinhaDetailActivity.class);
detailIntent.putExtra(LinhaDetailFragment.ARG_ITEM_ID, id);
startActivity(detailIntent);
}
}
}
此处虚拟内容:
public class DummyContent {
public static List<DummyItem> ITEMS = new ArrayList<DummyItem>();
public static Map<String, DummyItem> ITEM_MAP = new HashMap<String, DummyItem>();
static {
addItem(new DummyItem("1", "004 - LINE NAME", "Line 004 Details"));
addItem(new DummyItem("2", "005 - LINE NAME", "Line 005 Details"));
addItem(new DummyItem("3", "And so on....", "Details"));
addItem(new DummyItem("100", "100 - LINE NAME", "Line 100 Details"));
}
private static void addItem(DummyItem item) {
ITEMS.add(item);
ITEM_MAP.put(item.id, item);
}
public static class DummyItem {
public String id;
public String content;
public String details;
public DummyItem(String id, String content, String details) {
this.id = id;
this.content = content;
this.details = details;
}
@Override
public String toString() {
return content;
}
}
}
问题:如何让其中一个按钮启动对应的ItemDetailsActivity ListView?
示例:在 ActivityEast 我有 botao_l_501,在 ListView
它对应于 item 33。
我要botao_l_501开始详细ListView
的第33条。 (模板主/详细流程,Google)
你可能想知道的事情:
- ListView 在另一个 Activity 中,与中的所有项目分开
导航抽屉,但您可以通过 FAB 启动它;
- ListView 是 Master/Detail Flow 的模型。这些项目是
已设置(尚未设置详细信息);
所以基本上您需要与区域活动(即 ActivityEast
)共享 LinhaListFragment
中的适配器信息。问题是在 LinhaListFragment
中你有一个 Adapter
因为你使用的是 ListFragment
但在 ActivityEast
中你有一个 LinearLayout
和一堆Buttons
,那么我们如何映射这两个东西一起工作?
第一个解决方案(Hack & Nasty)
在您的 DummyContent
class 中,当您添加项目时,还要添加对 Button
id 的引用:
static {
addItem(new DummyItem(R.id.idbotao_l_001, "1", "004 - LINE NAME", "Line 004 Details"));
addItem(new DummyItem(R.id.idbotao_l_002, "2", "005 - LINE NAME", "Line 005 Details"));
addItem(new DummyItem(R.id.idbotao_l_033, "33", "033 - LINE NAME", "Details"));
addItem(new DummyItem(R.id.idbotao_l_100, "100", "100 - LINE NAME", "Line 100 Details"));
}
然后在每个按钮的 onClick 中你可以做这样的事情:
@Override
public void onClick(View view) {
for (DummyItem item : DummyContents.ITEMS) {
if (item.resourceId == view.getId()) {
//Start the item detail activity
break;
}
}
}
我不知道您是否在使用 DummyContent
class 因为您的内容永远不会改变,如果您正在使用它,因为您只是在测试代码。如果将来您要从网络服务中获取该数据,那么此解决方案将毫无用处。
第二种解决方案(干净)
首先,如果你真的想遵循 master/detail 规范,那么你应该只将活动用作片段持有者,因此像 ActivityEast
这样的区域活动不应该存在,你也不应该带有一堆按钮的 LinearLayout
。用 ZoneActivity
替换它,其中包含 ZoneFragment
和 RecyclerView
(没有人再使用 ListView
或 ListFragment
) RecyclerView
应该设置为启动 ZoneActivity
时在 LinhaListFragment
中使用的 Adapter
要求区域 ID 由 Intent
的捆绑包发送,该 ID 通过ZoneFragment
最后设置为 Adapter
。 Adapter
包含 filter/show 每个区域的行数的逻辑。区域 ID 参数应该不是必需的,因为 ListFragment
它也将使用相同的适配器并且没有区域 ID。
既然您说您刚刚开始 android 开发,那么有一些技巧可以帮助您:
不要使用 ListView
而是使用 RecyclerView
。
永远不要像在 ActivityEast
中做的那样,如果你要有这么多按钮使用 RecyclerView
即使你的数据是静态的。
没有人再使用 ListFragment
这样的东西了。如果你从类似的东西扩展你附加到那个 class,尝试从你自己的基础 classes 或非常基本的基础 classes 像 Fragment 和 Activity 继承].
尝试使用不分隔代码的区域。例如:
public class MyFragment 扩展片段 {
//region Variables
private int myField;
//endregion
//region Fragment lifecycle
protected void onCreate(Bundle saveInstance) {
//...
}
//endregion
}
然后您可以折叠它们并以更舒适的方式阅读代码。
- 永远不要开始 activity 显式,例如:
不好
Intent intent = new Intent(context, MyActivity.class);
intent.putExtra("zoneId",myZoneId);
startActivity(intent);
好
startActivity(MyActivity.getStartIntent(context, myZoneId));
....
//In MyActivity class
public static getStartIntent(Context context, int zoneId) {
Intent intent = new Intent(context, MyActivity.class);
intent.putExtra(MyActiviy.ZONE_ID, zoneId);
return zoneId;
}
}
我是 Android 开发的初学者。
我知道,这个标题似乎很难理解,但请让我解释一下
我的应用程序是我所在城市的公交线路指南,它包含两个不同的视图:
- A
ListView
所有公交线路的数字,简单顺序,没有 特别的。它恰好包含 100 个项目。 - A
NavigationDrawer
IN ANOTHER ACTIVITY 具有相同的线条,但按区域(北、南、东、东南)分隔
每个 NavigationDrawer
菜单都指向一个 Activity,其中有几个按钮和公交线路,但只有那些属于 X 区(例如东部)的按钮和公交线路
这里是Activity东的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="6dp"
android:paddingBottom="6dp"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:showIn="@layout/activity_leste" tools:context="com.lennoardsilva.teresinabus.Leste">
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/scrollView2"
android:layout_alignParentTop="true">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_245"
android:id="@+id/botao_l_245" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_401"
android:id="@+id/botao_l_401" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_402"
android:id="@+id/botao_l_402" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_403"
android:id="@+id/botao_l_403" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_404"
android:id="@+id/botao_l_404" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_405"
android:id="@+id/botao_l_405" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_501"
android:id="@+id/botao_l_501" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_502"
android:id="@+id/botao_l_502" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_503"
android:id="@+id/botao_l_503" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_512"
android:id="@+id/botao_l_512" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_513"
android:id="@+id/botao_l_513" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_518"
android:id="@+id/botao_l_518" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_520"
android:id="@+id/botao_l_520" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_521"
android:id="@+id/botao_l_521" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_522"
android:id="@+id/botao_l_522" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_523"
android:id="@+id/botao_l_523" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/l_610"
android:id="@+id/botao_l_610" />
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/carregar_mais"
android:id="@+id/botao_carregar_leste"
android:background="@color/cinza_escuro"
android:textColor="@color/branco"
android:textStyle="bold"
android:onClick="leste_2"
android:visibility="gone" />
</LinearLayout>
</ScrollView>
</RelativeLayout>
<!-- As a told you, a lot of buttons -->
此处 LineListFragment:
package com.lennoardsilva.teresinabus;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.lennoardsilva.teresinabus.dummy.DummyContent;
public class LinhaListFragment extends ListFragment {
private static final String STATE_ACTIVATED_POSITION = "activated_position";
private Callbacks mCallbacks = sDummyCallbacks;
private int mActivatedPosition = ListView.INVALID_POSITION;
public interface Callbacks {
public void onItemSelected(String id);
}
private static Callbacks sDummyCallbacks = new Callbacks() {
@Override
public void onItemSelected(String id) {
}
};
public LinhaListFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(),android.R.layout.simple_list_item_activated_1, android.R.id.text1, DummyContent.ITEMS));
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (savedInstanceState != null && savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) {
setActivatedPosition(savedInstanceState.getInt(STATE_ACTIVATED_POSITION));
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// Activities containing this fragment must implement its callbacks.
if (!(activity instanceof Callbacks)) {
throw new IllegalStateException("Activity must implement fragment's callbacks.");
}
mCallbacks = (Callbacks) activity;
}
@Override
public void onDetach() {
super.onDetach();
mCallbacks = sDummyCallbacks;
}
@Override
public void onListItemClick(ListView listView, View view, int position, long id) {
super.onListItemClick(listView, view, position, id);
mCallbacks.onItemSelected(DummyContent.ITEMS.get(position).id);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (mActivatedPosition != ListView.INVALID_POSITION) {
outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition);
}
}
public void setActivateOnItemClick(boolean activateOnItemClick) {
getListView().setChoiceMode(activateOnItemClick ? ListView.CHOICE_MODE_SINGLE : ListView.CHOICE_MODE_NONE);
}
private void setActivatedPosition(int position) {
if (position == ListView.INVALID_POSITION) {
getListView().setItemChecked(mActivatedPosition, false);
} else {
getListView().setItemChecked(position, true);
}
mActivatedPosition = position;
}
}
这里是行列表Activity:
public class LinhaListActivity extends AppCompatActivity
implements LinhaListFragment.Callbacks {
private boolean mTwoPane;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_linha_app_bar);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setTitle(getTitle());
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DialogFragment dialog = new FragmentoDatabase();
dialog.show(getFragmentManager(), "FragmentoDatabaseTag");
}
});
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
if (findViewById(R.id.linha_detail_container) != null) {
mTwoPane = true;
((LinhaListFragment) getSupportFragmentManager()
.findFragmentById(R.id.linha_list))
.setActivateOnItemClick(true);
}
// TODO: If exposing deep links into your app, handle intents here.
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onItemSelected(String id) {
if (mTwoPane) {
Bundle arguments = new Bundle();
arguments.putString(LinhaDetailFragment.ARG_ITEM_ID, id);
LinhaDetailFragment fragment = new LinhaDetailFragment();
fragment.setArguments(arguments);
getSupportFragmentManager().beginTransaction().replace(R.id.linha_detail_container, fragment).commit();
} else {
Intent detailIntent = new Intent(this, LinhaDetailActivity.class);
detailIntent.putExtra(LinhaDetailFragment.ARG_ITEM_ID, id);
startActivity(detailIntent);
}
}
}
此处虚拟内容:
public class DummyContent {
public static List<DummyItem> ITEMS = new ArrayList<DummyItem>();
public static Map<String, DummyItem> ITEM_MAP = new HashMap<String, DummyItem>();
static {
addItem(new DummyItem("1", "004 - LINE NAME", "Line 004 Details"));
addItem(new DummyItem("2", "005 - LINE NAME", "Line 005 Details"));
addItem(new DummyItem("3", "And so on....", "Details"));
addItem(new DummyItem("100", "100 - LINE NAME", "Line 100 Details"));
}
private static void addItem(DummyItem item) {
ITEMS.add(item);
ITEM_MAP.put(item.id, item);
}
public static class DummyItem {
public String id;
public String content;
public String details;
public DummyItem(String id, String content, String details) {
this.id = id;
this.content = content;
this.details = details;
}
@Override
public String toString() {
return content;
}
}
}
问题:如何让其中一个按钮启动对应的ItemDetailsActivity ListView?
示例:在 ActivityEast 我有 botao_l_501,在 ListView
它对应于 item 33。
我要botao_l_501开始详细ListView
的第33条。 (模板主/详细流程,Google)
你可能想知道的事情:
- ListView 在另一个 Activity 中,与中的所有项目分开 导航抽屉,但您可以通过 FAB 启动它;
- ListView 是 Master/Detail Flow 的模型。这些项目是 已设置(尚未设置详细信息);
所以基本上您需要与区域活动(即 ActivityEast
)共享 LinhaListFragment
中的适配器信息。问题是在 LinhaListFragment
中你有一个 Adapter
因为你使用的是 ListFragment
但在 ActivityEast
中你有一个 LinearLayout
和一堆Buttons
,那么我们如何映射这两个东西一起工作?
第一个解决方案(Hack & Nasty)
在您的 DummyContent
class 中,当您添加项目时,还要添加对 Button
id 的引用:
static {
addItem(new DummyItem(R.id.idbotao_l_001, "1", "004 - LINE NAME", "Line 004 Details"));
addItem(new DummyItem(R.id.idbotao_l_002, "2", "005 - LINE NAME", "Line 005 Details"));
addItem(new DummyItem(R.id.idbotao_l_033, "33", "033 - LINE NAME", "Details"));
addItem(new DummyItem(R.id.idbotao_l_100, "100", "100 - LINE NAME", "Line 100 Details"));
}
然后在每个按钮的 onClick 中你可以做这样的事情:
@Override
public void onClick(View view) {
for (DummyItem item : DummyContents.ITEMS) {
if (item.resourceId == view.getId()) {
//Start the item detail activity
break;
}
}
}
我不知道您是否在使用 DummyContent
class 因为您的内容永远不会改变,如果您正在使用它,因为您只是在测试代码。如果将来您要从网络服务中获取该数据,那么此解决方案将毫无用处。
第二种解决方案(干净)
首先,如果你真的想遵循 master/detail 规范,那么你应该只将活动用作片段持有者,因此像 ActivityEast
这样的区域活动不应该存在,你也不应该带有一堆按钮的 LinearLayout
。用 ZoneActivity
替换它,其中包含 ZoneFragment
和 RecyclerView
(没有人再使用 ListView
或 ListFragment
) RecyclerView
应该设置为启动 ZoneActivity
时在 LinhaListFragment
中使用的 Adapter
要求区域 ID 由 Intent
的捆绑包发送,该 ID 通过ZoneFragment
最后设置为 Adapter
。 Adapter
包含 filter/show 每个区域的行数的逻辑。区域 ID 参数应该不是必需的,因为 ListFragment
它也将使用相同的适配器并且没有区域 ID。
既然您说您刚刚开始 android 开发,那么有一些技巧可以帮助您:
不要使用
ListView
而是使用RecyclerView
。永远不要像在
ActivityEast
中做的那样,如果你要有这么多按钮使用RecyclerView
即使你的数据是静态的。没有人再使用
ListFragment
这样的东西了。如果你从类似的东西扩展你附加到那个 class,尝试从你自己的基础 classes 或非常基本的基础 classes 像 Fragment 和 Activity 继承].尝试使用不分隔代码的区域。例如:
public class MyFragment 扩展片段 {
//region Variables
private int myField;
//endregion
//region Fragment lifecycle
protected void onCreate(Bundle saveInstance) {
//...
}
//endregion
}
然后您可以折叠它们并以更舒适的方式阅读代码。
- 永远不要开始 activity 显式,例如:
不好
Intent intent = new Intent(context, MyActivity.class);
intent.putExtra("zoneId",myZoneId);
startActivity(intent);
好
startActivity(MyActivity.getStartIntent(context, myZoneId));
....
//In MyActivity class
public static getStartIntent(Context context, int zoneId) {
Intent intent = new Intent(context, MyActivity.class);
intent.putExtra(MyActiviy.ZONE_ID, zoneId);
return zoneId;
}
}