【问题标题】:ListView inside a listView Item列表视图项内的列表视图
【发布时间】:2018-01-04 17:55:16
【问题描述】:

我想在列表视图项中使用列表视图。代码如下。

MainActivity.java

String[][] topicLists = {{"one,one","one,two","one,three","one,four","one,five"}
                            ,{"two,one","two,two","two,three","two,four"}
                            ,{"three,one","three,two","three,three","three,four","three,five","three,six"}
                            ,{"four,one","four,two","four,three"}};

    ListView listView = (ListView) findViewById(R.id.recyclerView);
    CardsAdapter cardsAdapter = new CardsAdapter(this, topicLists);
    listView.setAdapter(cardsAdapter);

CardsAdapter.java

String[][] allTopics = {};

public CardsAdapter(@NonNull Context context, String[][] unitsAndTopics) {
    super(context, 0,unitsAndTopics);
    allTopics = unitsAndTopics;
}

@Nullable
@Override
public Object getItem(int position) {
    ArrayList<String> all = new ArrayList<String>();
    for (int i = 0; i <allTopics[position].length ; i++) {
        all.add(allTopics[position][i]);
        Log.e("",allTopics[position][i]);
    }

    return all;
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

    View listItem = convertView;
    if (listItem==null)
        listItem = LayoutInflater.from(getContext()).inflate(R.layout.card_view,parent,false);

    ArrayList<String> currentItem = (ArrayList<String>) getItem(position);

    ListView topic = (ListView) listItem.findViewById(R.id.listView);
    ListAdapter listAdapter = new ListAdapter(getContext(),currentItem);
    topic.setAdapter(listAdapter);

    return listItem;
}

ListAdapter.class

    public ListAdapter(@NonNull Context context, ArrayList<String> topics) {
    super(context, 0,topics);
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

    View listItem = convertView;
    if (listItem==null)
        listItem = LayoutInflater.from(getContext()).inflate(R.layout.list_item,parent,false);

    final String currentItem = (String) getItem(position);

    TextView topic = (TextView) listItem.findViewById(R.id.topic_text_view);
    topic.setText(currentItem);

    Button search = (Button) listItem.findViewById(R.id.search_button);
    search.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            try {
                Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
                String term = currentItem;
                intent.putExtra(SearchManager.QUERY, term);
                getContext().startActivity(intent);
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
    });

    return listItem;
}

在上图中,所有数组中唯一的第一个元素出现在列表中。其余的都没有出现 任何建议都会有所帮助。

【问题讨论】:

    标签: android android-layout listview android-adapter listview-adapter


    【解决方案1】:

    您的代码运行正常,请看这里

    我将第一个 listview 项 xml 文件高度修复为 150dp (card_view),它在这里正常工作是所有代码

    1) 卡片视图:

    <?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="200dp">
    
        <ListView
            android:id="@+id/listView"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </RelativeLayout>
    

    2) 列表视图适配器:

    import android.app.SearchManager;
        import android.content.Context;
        import android.content.Intent;
        import android.support.annotation.NonNull;
        import android.support.annotation.Nullable;
        import android.util.Log;
        import android.view.LayoutInflater;
        import android.view.View;
        import android.view.ViewGroup;
        import android.widget.BaseAdapter;
        import android.widget.Button;
        import android.widget.ListAdapter;
        import android.widget.TextView;
    
        import java.util.ArrayList;
    
    
        public class ListNewAdapter extends BaseAdapter{
    
            private static final String TAG = "ListNewAdapter";
            private final ArrayList<String> topics;
            private final Context context;
    
            public ListNewAdapter(@NonNull Context context, ArrayList<String> topics) {
               this.context = context;
               this.topics = topics;
            }
    
            @Override
            public int getCount() {
                Log.d(TAG, "getCount:"+topics.size());
                return topics.size();
            }
    
            @Override
            public Object getItem(int i) {
                return topics.get(i);
            }
    
            @Override
            public long getItemId(int i) {
                return i;
            }
    
            @NonNull
            @Override
            public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    
                View listItem = convertView;
                if (listItem==null)
                    listItem = LayoutInflater.from(context).inflate(R.layout.list_item,parent,false);
    
                final String currentItem = (String) getItem(position);
    
                TextView topic = (TextView) listItem.findViewById(R.id.topic_text_view);
                topic.setText(currentItem);
    
    
                return listItem;
            }
        }
    

    3) 卡片适配器:

    import android.content.Context;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ListView;
    
    import java.util.ArrayList;
    
    
    public class CardsAdapter extends BaseAdapter {
    
        private static final String TAG = "CardsAdapter";
        private final Context context;
        String[][] allTopics = {};
    
        public CardsAdapter(@NonNull Context context, String[][] unitsAndTopics) {
            this.context = context;
            allTopics = unitsAndTopics;
        }
    
        @Override
        public int getCount() {
            return allTopics.length;
        }
    
        @Nullable
        @Override
        public Object getItem(int position) {
            ArrayList<String> all = new ArrayList<String>();
            for (int i = 0; i <allTopics[position].length ; i++) {
                all.add(allTopics[position][i]);
                Log.d(TAG, "getItem:"+all);
            }
    
            return all;
        }
    
        @Override
        public long getItemId(int i) {
            return i;
        }
    
        @NonNull
        @Override
        public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    
            View listItem = convertView;
            if (listItem==null)
                listItem = LayoutInflater.from(context).inflate(R.layout.card_view,parent,false);
    
            ArrayList<String> currentItem = (ArrayList<String>) getItem(position);
    
            ListView topic = (ListView) listItem.findViewById(R.id.listView);
            ListNewAdapter listNewAdapter = new ListNewAdapter(context,currentItem);
            topic.setAdapter(listNewAdapter);
    
            return listItem;
        }
    }
    

    【讨论】:

    • 谢谢达拉·帕特尔。我做到了,它可以工作,但是当我填充内部列表时,它不会滚动。任何建议,都会很有帮助。
    • 对于 NestedScrollView 你可以参考这个stackoverflow.com/a/6211286/4427519
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 2013-09-18
    • 2012-09-24
    • 2013-10-01
    相关资源
    最近更新 更多