【问题标题】:How to use custom Adapter如何使用自定义适配器
【发布时间】:2013-10-20 20:06:25
【问题描述】:

我知道这是一个转贴,但我一直试图让它工作多年(几个小时),我真的无法理解现有的答案。 我只想知道:如何编辑此代码以使其正常工作?我正在尝试从两个不同的数组填充两个文本视图。

只有第二个适配器被读取,第一个的 textview 保持空白。

任何帮助都将不胜感激。

        public void run () {                

            if (t.getState() == Thread.State.TERMINATED) {
                adapter2 = new ArrayAdapter<String>(getApplicationContext(), R.layout.listlook, R.id.txtl2, names);
                setListAdapter(adapter2);
                adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.listlook, R.id.txtl1, comments);
                setListAdapter(adapter);
                return;
            } else {
                h.postDelayed(this, 1000);  
            }

        }}
    , 1000);    
}

提前致谢。

Usercmets.xml 中的列表视图

            <ListView
            android:id="@+android:id/list"
            android:layout_width="match_parent"
            android:layout_height="150dp" >
            </ListView>

listlook.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

    <TextView
    android:id="@+id/txtl1"
    android:paddingLeft="2dp"
    android:textSize="20sp"
    android:textStyle="bold"
    android:textColor="#0000FF"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="TextView" />

    <TextView
    android:id="@+id/txtl2"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/txtl1"
    android:gravity="bottom|right"
    android:paddingLeft="5dp"
    android:text="TextView"
    android:textColor="#5C002E"
    android:textSize="15sp" />

    </RelativeLayout>

listlook 只是我在列表视图中使用的布局?真的不知道我在做什么。

【问题讨论】:

  • 一个适配器被附加到一个 ListView。我猜您的活动只有一个 ListView,因为每个 ListView 只能有 1 个适配器,所以您正在用 Seconds 替换您的第一个适配器。看起来只使用了第二个适配器。如果您想同时显示两者,您可能需要添加另一个 ListView,或者将两个 List 合而为一,然后重试。
  • 嘿,Daniel,我正在使用带有两个文本视图的自定义列表视图,但我有点自学成才,无法理解现有代码中有关此类事物的任何内容。感谢您的回复:)
  • 我认为问题在于,您不了解 listView 适配器背后的想法。 ListView 没有特定的 TesxView 计数。你能显示 listLook 布局吗?

标签: android android-arrayadapter listadapter


【解决方案1】:

你告诉列表视图你想使用adapter2,然后告诉它你想使用adapter - 它一次只能从一个适配器读取数据

如果你想显示两个列表中的数据,你可以这样做。

首先,将您的两个列表组合成一个类,并构建一个 List&lt;Post&gt;,而不是两个数组:

public class Post {
    String mName, mComment;
    public Post(String name, String comment) {
        mName = name;
        mComment = comment;
    }

    public String getName() {
        return mName;
    }

    public String getComment() {
        return mComment;
    }

}

然后,编写一个知道如何显示Post项目的适配器:

public class PostAdapter extends BaseAdapter {

    private Activity mActivity;
    private List<Post> mPosts;

    public TweetstreamAdapter(Activity activity, List<Post> posts) {
        mActivity = activity;
        mPosts = posts;
    }

    @Override
    public int getCount() {
        return mPosts.size();
    }

    @Override
    public Post getItem(int position) {
        return mPosts.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Post post = getItem(position);
        if (convertView == null) {
            convertView = mActivity.getLayoutInflater().inflate(R.layout.listlook, parent, false);
        }
        ((TextView)convertView.findViewById(R.id.txtl1)).setText(post.getName());
        ((TextView)convertView.findViewById(R.id.txtl2)).setText(post.getComment());
        return convertView;
    }

}

然后在您的活动中,您将适配器设置为:

setListAdapter(new PostAdapter(this, posts));

其中postsList&lt;Post&gt; 的帖子。

注意您需要确保TextView 布局中的listlook 条目的ID 与适配器正在搜索的ID 相匹配。相应地更新代码以匹配您的 ID。 更新以匹配您的 ID。如果您正确构造了Post 对象的列表,这应该只是插入。

更新 2:您可以像这样构建一个列表,假设两个数组(名称/cmets)的长度相同

List<Post> posts = new ArrayList<Post>();
for(int i = 0; i < names.length; i++) {
    posts.add(new Post(names[i], comments[i]);
}

【讨论】:

  • 我正在使用 PHPMySQL 数据库中的数据填充列表。非常丰富的答案,但不是很熟悉为一个活动使用不同的类,我是否按原样创建类?我将把调用 JSON 对象的方法放在哪里?
  • 您可以使用我在上面添加的代码使用现有字符串数组创建Post 对象列表。检索数据是一个完全不同的问题;如果您不确定该怎么做,我建议您进行更多研究,如果您仍然无法弄清楚,请提出一个新问题。
  • 如果您从 SQL 数据库中读取数据,您可能需要查看 CustomCursorAdapter
  • 列表正在填充,服务器正常工作。但就像你说的,它只是使用第二个适配器。所以我仍然会在活动中调用它,然后只需使用第二次编辑创建列表?
  • 是的,创建列表,然后将用于创建和设置适配器的 4 行替换为:setListAdapter(new PostAdapter(this, posts));
【解决方案2】:

您有两行与setListAdapter()。第二个覆盖第一个。如果您有两个ListViews,请执行以下操作:

listView1.setListAdapter(adapter2);
listView2.setListAdapter(adapter);

【讨论】:

    猜你喜欢
    • 2016-01-01
    • 1970-01-01
    • 2016-06-23
    • 2021-05-29
    • 2015-11-02
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多