当前位置: 首页 > 知识库问答 >
问题:

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

王兴腾
2023-03-14

我试图在我的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);
}

共有2个答案

景国兴
2023-03-14

解决方案是将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);
    }
凌宏大
2023-03-14

我应该如何使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,那么只有您可以使用这个。getListView()直接如上所述。如果您扩展了活动,请参考此答案。

答案是:

每当您使用活动时,您都会将your_layout.xml设置为活动的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);
 类似资料:
  • 我有一个ListView和一个自定义适配器。问题是我看不到listview和数据,只看到一个白色页面。 在片段中我有: 在CustomAdapter中,我有: 我错在哪里? 更新: 谢谢,如果我想在ImageButton上设置onClickListener,我该怎么做?。。我尝试: 但问题是,当我单击例如第一个项目viewHolder时。mNomeView。getText()。toString()

  • 但是,这也不起作用。

  • 我无法填充Firebase回收适配器。我最终想做的是,用户搜索一个名称,数据库中的结果将填充回收人员视图。 数据库结构如下所示: 要填充的代码如下所示,全部位于: 现在我只想让它填充数据库中的所有用户,但似乎什么都没有填充。 是一个。 这是UsersViewHolder类:公共静态类UsersViewHolder扩展了RecyclerView。视图持有者{View mView;TextView m

  • 英文原文:http://emberjs.com/guides/models/customizing-adapters/ 在Ember Data中,处理与后台数据仓库通信的逻辑是通过Adapter来完成的。Ember Data适配器内置了一些关于REST API的假定。如果后台的实现与Ember Data假定的惯例不同,那么通过扩展缺省的适配器可能很容易的实现。 有时因为一些原因需要自定义适配器,例

  • Ember.js适配器指定如何在后端数据存储中保存数据,例如URL格式和REST API标头。 默认的Ember适配器包含一些REST API的内置假设。 这些假设有助于更轻松,更好地构建Web应用程序。 可以使用以下命令创建适配器 - ember generate adapter adapter-name 运行上面的命令时,它将显示以下行 - import DS from 'ember-dat

  • 我正在从Ajax JSON创建一个DataTable。 将创建DataTables,但它显示一个错误: DataTables警告:表ID=CHANGETABLE-为行0,列0请求未知参数“0”。有关此错误的详细信息,请参阅http://datatables.net/TN/4 我的JSON看起来如下所示 在我的Java控制器中创建了这样的JSON对象: 我不知道如何将此信息与 属性一起使用,以使其适