列表项单击,在详细活动上从列表视图活动中导航下一个和上一个列表项
Posted
技术标签:
【中文标题】列表项单击,在详细活动上从列表视图活动中导航下一个和上一个列表项【英文标题】:List item click, on detail activity navigate through next and previous list items from list view activity 【发布时间】:2016-09-12 23:09:48 【问题描述】:我有 2 个活动,第一个包含列表视图,当用户单击该列表视图的列表项时,将启动详细视图活动(第二个活动)。
现在在第二个活动中,我有 2 个按钮,NEXT 按钮和 PREVIOUS 按钮,所以当用户点击 NEXT 按钮时,第一个活动的下一个列表项必须被显示。并且在单击上一个按钮时,必须显示上一个列表项。
我在第一个活动中扩展了 ArrayAdapter,以显示自定义列表项。在适配器上,有 2 个项目,即 2 个文本视图。
当用户点击并启动第二个活动时,这两个文本视图的详细信息将被详细显示。并通过项目进行导航,回到第一个活动,然后每个项目再次启动第二个活动,这对用户来说是忙碌的场景,所以我想在详细视图活动本身上导航项目。 那我该怎么办?
到目前为止我所做的是,我扩展了 ArrayAdapter,所以从 getView() 方法中,我获取了位置值,然后在我所做的第二个活动中,
next = (ImageView) findViewById(R.id.next);
previous = (ImageView) findViewById(R.id.previous);
next.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
position++;
Log.e("position", String.valueOf(position));
);
previous.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
position--;
Log.e("position", String.valueOf(position));
);
但我不知道下一步该怎么做?
位置值取自第一个活动,其中 intent.putExtra("position", position) 并在第二个活动中获取 使用 intent.getStringExtra("position")。
我什至无法理解 this 和 that ,只是理论上的。提前致谢。
EDIT-1:
我在第一个活动中有 custom ArrayAdapter,并且在 onclickListener 上,我已经申请了,
convertView.setOnClickListener(new OnClickListener()
@Override
public void onClick(View view)
Intent intent = new Intent(fActivity.this, sActivity.class);
intent.putExtra("txt1", "name");
intent.putExtra("txt2", "address");
intent.putExtra("position", position);
startActivity(intent);
);
这个位置是从
获取的public View getView(final int position, View convertView, ViewGroup parent)
....
这个方法,在
class homeAdapter extends ArrayAdapter<list>
正如我之前在同一面板上所写的那样。现在在第二个活动中,我必须在第二个活动中使用下一个和上一个按钮获得 txt1
和 txt2
。
【问题讨论】:
【参考方案1】:你只需要这样做,
在第二个活动中,
str1 = fActivity.listAdapter.getItem(position).data1;
str2 = fActivity.listAdapter.getItem(position).data2;
在第一个活动中,
public static ArrayAdapter<List> listAdapter;
你去吧,你可以得到你的答案。
干杯!
【讨论】:
【参考方案2】:如果您有静态列表并且不想动态更改列表数据,最简单的方法是将列表数据存储在您的 strings.xml
文件中,例如
<string-array name="textview1_items>
<item>head1</item>
<item>head2</item>
<item>head3</item>
.
.
.
</string-array>
同样适用于 textview 2 项。
然后在您的列表适配器和您的第二个活动中从这些字符串数组中检索列表项。
要从 java 访问这些数组,您需要执行以下操作:
String[] headers = context.getResources.getStringArray(R.array.textview1_items);
//在适配器中使用上下文,在第二个活动中使用 this
现在,当用户单击列表项时,只需将选定项的位置传递给第二个活动,并从您的字符串数组中检索该索引的信息。
希望对您有所帮助! 如有任何疑问,请追问!
【讨论】:
抱歉,我有自定义列表视图,其中包含 3 个文本视图和图像视图。无论如何感谢您的努力.. 您还可以为您的可绘制对象设置一个数组。 一切都是动态的,没有检索到静态项目。谢谢。【参考方案3】:为此,您必须保持您的 Array/List 全局,以便两个 Activity 都可以访问它。您也可以通过捆绑将整个数组/列表传递给下一个活动来做到这一点。
你必须做到以下几点:
-
将点击的位置和整个数组/列表放在包中,并将其发送到第二个活动。
从 bundle 中获取当前位置和数组/列表,并显示当前位置的详细信息。
点击Next按钮增加位置,从list.array中获取该位置的item并显示该位置的详细信息。
点击Previous按钮减少位置,从list.array中获取该位置的item并显示该位置的详细信息。
【讨论】:
【参考方案4】:如果您粘贴了用于填充 ListView 的代码,那将会非常有帮助。您使用哪种对象来创建列表?尽管如此,这里有一些代码和方法。我在这里假设了几件事,如果它们与您的代码不匹配,请评论答案。
创建一个 ArrayList,现在它可以像字符串 ArrayList<String>
或您想要的其他对象一样简单,例如 ArrayList<Items>
// 示例Array<Items> itemsList = new ArrayList<Items>();
现在在列表视图上的 itemClickListener 中,使用 Intents 将位置和整个数组列表传递给您的第二个活动。
listView.setOnItemClickListener(new AdapterView.OnItemClickListener()
@override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id)
Items item = (Items) parent.getItemAtPosition(position);
Intent startDetailActivity = new Intent(Activity1.this, Activity2.class);
startDetailActivity.putExtra("position", position);
startDetailActivity.putExtra("itemList", itemList);
startActivity(startDetailActivity);
);
在您的活动 2 中,解析意图数据:
Intent i = this.getIntent();
int clickedPosition = i.getIntExtra(position, 0);
ArrayList<Items> itemsList = i.getSerializableExtra("itemList");
通过在 itemsList 中的位置获取对象来设置文本视图上的数据:
textView1.setText(itemsList.get(clickedPosition).getSomeText());
textView2.setText(itemsList.get(clickedPosition).getSomeOtherText());
最后,当您单击活动 2 上的下一个和上一个按钮时,然后增大或减小 clickedPosition 变量的大小,使其指向列表中的正确对象。只要确保您从数组列表中请求的索引是有效的,否则您将获得索引越界异常。这可以通过在请求该索引处的对象之前检查数组列表的大小来完成。
现在,这个答案假设了很多事情,比如你有一个包含某个对象的数组列表。这些对象中的变量至少具有 getter 方法,并且这些变量所在的类实现了 Serializable 接口。 如果您在实现此代码时遇到任何问题,请将其放入 cmets.xml 中。我很乐意尽我所能提供帮助。
EDIT-1:
现在,我猜您已经能够解决您的 sActivity 中的意图,但是您在从位置和列表显示 sActivity 上的数据时遇到了问题。所以,首先要确保你已经通过了点击的位置以及意图中的整个列表。在 sActivity 中解决它们。现在,要从列表中显示 sActivity 中的数据,请编写以下代码行(在解决 sActivity 上的意图之后)。
yourTextView.setText(yourList.get(clickedPosition).getSomething());
yourTextView2.setText(yourList.get(clickedPosition).getSomeOtherThing());
不要被 getSomething() 弄糊涂了,它只是一个例子。你应该得到你想要在这里显示的数据。我还没有看到你正在制作的列表,所以我放了这段代码。现在,处理下一个和上一个按钮点击。只需在下次单击时添加到单击位置变量,例如:
nextButton.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
clickedPosition++;
yourTextView.setText(yourList.get(clickedPosition).getSomething());
yourTextView2.setText(yourList.get(clickedPosition).getSomeOtherThing());
);
在上一个按钮 onClick 上,只需减少 clickedPosition 变量,如:
clickedPosition--;
//set text views here then
我的朋友应该这样做。
【讨论】:
如果使用链接bundle use 并使用前面提到的捆绑包,那么它是正确的解决方案吗?正如@Ashish_Tiwari solution for this issue 所说 @vibhor_soni 在我的编辑之后你有别的出路吗? @JackSmith,刚刚看到你的编辑,基本上和我之前解释的一样。你有你的键值对的意图。如前所述,在 sActivity 中解决它们。就 text1 和 text2 而言,你已经完成了。至于列表本身,您需要在您的意图中添加另一个额外内容,即您从中显示列表视图的 ArrayList。在 sActivity 中解决它,然后,当您获得下一个和上一个单击事件时,添加或减去位置并使用列表显示数据。如果您仍然不清楚,请粘贴整个代码。但是,请先尝试一下。 @JackSmith,关于捆绑的问题。您也可以使用它,只是您需要先创建一个捆绑对象并为其设置数据。将该捆绑包添加到您的意图中。然后在 sActivity 中解析 bundle,并从 bundle 中获取项目。 我无法在intent.putExtra
中传递itemList
.. 而且这个解决方案不起作用,因为即使position
的值增加或减少,我也无法使用这种方法,因为我不确定如何将 txt1、txt2 和位置值放入列表并在 sActivity
.. 中获得相同的列表以上是关于列表项单击,在详细活动上从列表视图活动中导航下一个和上一个列表项的主要内容,如果未能解决你的问题,请参考以下文章
当我单击列表视图的操作项时,将文本从列表视图传递到另一个活动