繁体   English   中英

将onClickListener设置为由自定义适配器填充的LinearLayout

[英]Set onClickListener to LinearLayout filled by custom adapter

我想在ScrollView中显示两个列表。 我找到了以下解决方案: 使用ListAdapter填充ScrollView布局中的 LinearLayout(使用自定义适配器填充LinearLayout)。

此解决方案工作正常,但我不知道如何处理列表项上的单击事件。 如果我使用ListView(带位置参数的onItemClick方法)但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中。 它应该如下所示:

在此输入图像描述

解:

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

如何使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那么只有您可以直接使用ListActivity this.getListView() ,如上所述。 如果您扩展Activity请参阅此答案

答案表明:

每当您使用Activity时,您都将your_layout.xml设置为Activity的ContentView。 所以ListView应该在your_layout.xml中。

那个ListView应该有一个在xml文件中定义的id属性说:(android:id =“@ + id / list”)。 您可以通过以下方式获取ListView对象:

setContentView(R.layout.your_layout);
ListView list = (ListView)findViewById(R.id.list);
list.addFooterView(view);

解决方案是将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);
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM