我想在ScrollView中显示两个列表。我找到了以下解决方案:Using a ListAdapter to fill a LinearLayout inside a ScrollView layout(使用自定义适配器填充LinearLayout)。
此解决方案工作正常但我不知道如何处理列表项上的click事件。如果我使用ListView(onItemClick方法和position参数)会很简单,但LinearLayout不支持相同的功能。
我的布局:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="fill_parent"
android:layout_width="match_parent"
android:orientation="vertical"
android:scrollbars="none"
android:background="@color/background_gray_light">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
// here should be view with infobox, not implemented yet //
<LinearLayout
android:id="@+id/story_list_inbox"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/archive"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:background="@color/actionbar_bg"
android:text="@string/archive"
android:textSize="16dp"
android:textColor="@color/text_gray"
android:gravity="center_horizontal" />
<LinearLayout
android:id="@+id/story_list_archive"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
填充列表:
public class StoryListFragment extends Fragment {
public StoryListFragment() {}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_story_list, container,
false);
TextView archiveText = (TextView) view.findViewById(R.id.archive);
archiveText.setText(archiveText.getText().toString().toUpperCase());
final List<Story> storyList = new ArrayList<Story>();
// filling the list ....
StoryListAdapter adapter = new StoryListAdapter(getActivity(), R.layout.story_list_item, storyList);
LinearLayout inbox = (LinearLayout) view.findViewById(R.id.story_list_inbox);
final int inboxCount = adapter.getCount();
for (int i = 0; i < inboxCount; i++) {
View item = adapter.getView(i, null, null);
inbox.addView(item);
}
/* archive */
// filling the list ....
LinearLayout archive = (LinearLayout) view.findViewById(R.id.story_list_archive);
final int archiveCount = adapter.getCount();
for (int i = 0; i < archiveCount; i++) {
View item = adapter.getView(i, null, null);
archive.addView(item);
}
return view;
}
}
问题:
如何使LinearLayout列表项可以点击以获取所点击项的索引?
我甚至想要实现的目标:
也许我甚至没有使用正确的解决方案,我在这里想要实现的是创建类似于消息收件箱的内容,其中包含两个列表 - 一个用于最新消息,另一个用于存档消息。我还想在列表顶部显示一些内容,所以我把它全部放在ScrollView中。它应该是这样的:
SOLUTION:
for (int i = 0; i < inboxCount; i++) {
final int index = i;
View item = adapter.getView(i, null, null);
item.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
System.out.println("Clicked " + index);
startActivity(new Intent(v.getContext(), StoryIntroActivity.class));
}
});
inbox.addView(item);
}
答案 0 :(得分:0)
如何使LinearLayout列表项可以点击以获取所点击项目的索引?
您可以执行以下操作,以便将点击的项目索引传递到您可能想要响应点击的其他活动。在您的onCreate
执行以下操作:
getListView().setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> arg0, View v, int position, long id)
{
//position is the item number in your listview
Intent intent = new Intent(getApplicationContext(),xyz.class);
intent.putExtra("itemNo.", position);
startActivity(intent);
}
});
请注意,如果您的课程延长ListActivity
,那么只有您可以直接使用this.getListView()
,如上所述。如果您延长Activity
,请参阅to this answer。
答案表明:
每当您使用Activity时,您都将your_layout.xml设置为Activity的ContentView。所以ListView应该在your_layout.xml中。
ListView应该在xml文件中定义一个id属性说:(android:id =&#34; @ + id / list&#34;)。你可以通过这种方式得到ListView对象:
setContentView(R.layout.your_layout);
ListView list = (ListView)findViewById(R.id.list);
list.addFooterView(view);
答案 1 :(得分:0)
解决方案是将onClickListener设置为动态创建的视图,如下所示:
for (int i = 0; i < inboxCount; i++) {
final int index = i;
View item = adapter.getView(i, null, null);
item.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
System.out.println("Clicked " + index);
startActivity(new Intent(v.getContext(), StoryIntroActivity.class));
}
});
inbox.addView(item);
}