单击列表项,详细信息 activity 从列表视图浏览下一个和上一个列表项 activity

List item click, on detail activity navigate through next and previous list items from list view activity

我有 2 个活动,第一个包含列表视图,当用户单击该列表视图的列表项时,将启动详细视图 activity(第二个 activity)。

现在在第 2 个 activity,我有 2 个按钮,NEXT 按钮和 PREVIOUS 按钮,所以当用户点击NEXT 按钮,必须显示第一个 activity 中的下一个列表项。单击上一个按钮时,必须显示上一个列表项。

我在 1st activity 上扩展了 ArrayAdapter 以显示自定义列表项。在适配器上,有 2 个项目,即 2 个文本视图。

并且当用户点击并启动第 2 个 activity 时,将详细显示这 2 个 textview 的详细信息。并通过项目导航,返回到第一个 activity,然后每个项目再次启动第二个 activity,这对用户来说是忙碌的场景,所以我想详细导航项目查看 activity 本身。 那我该怎么办?

到目前为止我所做的是,我扩展了 ArrayAdapter,所以我从 getView() 方法中获取了位置值,然后在第 2 activity 我所做的是,

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

        }
    });

但是我不知道下一步该怎么做?

The position value is taken from 1st activity, with intent.putExtra("position", position) and fetched on 2nd activity using intent.getStringExtra("position").

我什至无法理解 this and that ,这只是理论上的。提前致谢。


EDIT-1:

我在第一个 activity 中有 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>

正如我之前在同一个面板上所写的那样。现在在 2nd activity 我必须在 2nd activity 使用下一个和上一个按钮获得 txt1txt2

为此,您必须将 Array/List 保持为全局,以便 activity 都可以访问它。您也可以通过捆绑将整个 array/list 传递给下一个 activity 来做到这一点。

您必须执行以下操作:

  1. 将点击的位置和整个array/list打包发送到第二个activity。
  2. 从 bundle 中获取当前位置和 array/list 并显示当前位置的详细信息。
  3. 点击Next按钮增加位置,从list.array获取该位置的item并显示该位置的详细信息。
  4. 点击Previous按钮减少位置,从list.array获取该位置的项目并显示该位置的详细信息。

如果您粘贴了用于填充 ListView 的代码,那将非常有帮助。您使用哪种对象来创建列表? none less,这里是一些代码和方法。我在这里假设了一些事情,如果它们与您的代码不匹配,请评论答案。

  1. 创建一个 ArrayList,现在这可以像字符串 ArrayList<String> 或您想要的其他一些对象一样简单,例如 ArrayList<Items> // 样本 Array<Items> itemsList = new ArrayList<Items>();

  2. 现在在列表视图的 itemClickListener 中,使用 Intents 将位置和整个数组列表传递给第二个 activity。

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

    });

  3. 在你的activity2中,解析意图数据:

    Intent i = this.getIntent(); int clickedPosition = i.getIntExtra(position, 0); ArrayList<Items> itemsList = i.getSerializableExtra("itemList");

  4. 通过在 itemsList 中的位置获取对象来设置文本视图的数据:

    textView1.setText(itemsList.get(clickedPosition).getSomeText()); textView2.setText(itemsList.get(clickedPosition).getSomeOtherText());

最后,当您单击 activity 2 上的下一个和上一个按钮时,然后增大或减小 clickedPosition 变量的大小,使其指向列表中的正确对象。只要确保您从数组列表中请求的索引是有效的,否则您将得到一个索引越界异常。这可以通过在请求该索引处的对象之前检查数组列表的大小来完成。

现在,这个答案假设了很多事情,比如你有一些对象的数组列表。这些对象中的变量至少有 getter 个方法,并且这些变量所在的 class 实现了一个 Serializable 接口。 如果您在执行此代码时遇到任何问题,请将其放在评论中。我很乐意尽我所能提供帮助。

编辑-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

我的朋友,这应该做到。

如果您有静态列表并且不想动态更改列表数据,最简单的方法是将列表数据存储在 strings.xml 文件中,例如

<string-array name="textview1_items> 
<item>head1</item>
<item>head2</item>
<item>head3</item>
.
.
.
</string-array>

同样适用于 textview 2 项。

然后在您的列表适配器和第二个 activity.

中从这些字符串数组中检索列表项

要从 java 访问这些数组,您需要执行以下操作:

String[] headers = context.getResources.getStringArray(R.array.textview1_items); //在适配器中使用上下文,在第二个中使用此 activity

现在,当用户单击列表项时,只需将所选项目的位置传递给第二个 activity 并从您的字符串数组中检索该索引的信息。

希望对您有所帮助! 如有疑问请追问!

您只需要做,

第二个 activity,

str1 = fActivity.listAdapter.getItem(position).data1;
str2 = fActivity.listAdapter.getItem(position).data2;

并且在第一个 activity,

public static ArrayAdapter<List> listAdapter;

好了,你可以得到答案了。

干杯!